有没有机会在xaml中设置事件处理程序而不使用c#,powershell等? 例如,我想在点击后设置另一个控件的文本。下面是我想要做的“伪代码”:
<Button Content="Set value = text1" OnClick="txt1.Text = text1" />
<Button Content="Set value = text2" OnClick="txt1.Text = text2" />
<Textbox Name="txt1" />
答案 0 :(得分:6)
您可以在xaml中编写内联c#。虽然这只是你应该不惜一切代价避免的东西。如果你绝对必须,你可以做类似的事情:
<StackPanel>
<Button Content="Set value = text1" Click="InlineHandler" />
<Button Content="Set value = text2" Click="InlineHandler" />
<TextBox Name="txt1" />
<x:Code>
<![CDATA[
private void InlineHandler(object sender, RoutedEventArgs e) {
var btn = sender as Button;
if (btn == null)
return;
txt1.Text = btn.Content.ToString() == "Set value = text1" ? "text1" : "text2";
}
]]>
</x:Code>
</StackPanel>
MSDN Link - Code-Behind and XAML in WPF
简单来说,您只需在xaml中内联定义事件处理程序,而不是在代码隐藏中定义。
再次不采用这种方法,除非你证明了一点。
答案 1 :(得分:2)
有一个EventTrigger的解决方案。虽然它不适用于TextBox,但由于Text-Property不可设置动画,因此您可以使用一些按钮更改文本块的文本而不需要任何代码。
但是:这不是一个很好的解决方案,你应该使用一些简短的代码隐藏(最好是附加的行为)或一个小的viewModel,你绑定到某个属性。最后一个应该是最干净的解决方案,代码隐藏是最短的。
为了可行性,这里是您可以使用纯xaml更改控件文本的模板:
<ControlTemplate x:Key="MyTemplate" TargetType="Control">
<StackPanel Orientation="Horizontal">
<Button x:Name="buttonValueText1" Content="Set value = text1" Width="50" Height="50"/>
<Button x:Name="buttonValueText2" Content="Set value = text2" Width="50" Height="50"/>
<TextBlock x:Name="textBox" Height="30" Width="100" Margin="5"/>
</StackPanel>
<ControlTemplate.Triggers>
<EventTrigger SourceName="buttonValueText1" RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<StringAnimationUsingKeyFrames Storyboard.TargetName="textBox" Storyboard.TargetProperty="Text">
<DiscreteStringKeyFrame Value="Text1" KeyTime="0:0:0.1"/>
</StringAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger SourceName="buttonValueText2" RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<StringAnimationUsingKeyFrames Storyboard.TargetName="textBox" Storyboard.TargetProperty="Text">
<DiscreteStringKeyFrame Value="Text2" KeyTime="0:0:0.1"/>
</StringAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
答案 2 :(得分:2)
让您了解如何解决此问题
<StackPanel>
<ToggleButton Name="B1" Width="50" Height="50" Content="Text1"/>
<ToggleButton Name="B2" Width="50" Height="50" Content="Text2"/>
<TextBlock Width="50" Height="50" >
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=B1, Path=IsChecked}" Value="True">
<Setter Property="Text" Value="{Binding ElementName=B1, Path=Content}"/>
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=B2, Path=IsChecked}" Value="True">
<Setter Property="Text" Value="{Binding ElementName=B2, Path=Content}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
答案 3 :(得分:0)
在PowerShell中编写XAML处理程序是一个陡峭的悬崖。编写整个UI不是。我和Joel Bennett(又名Jaykul)将两个广受欢迎的解决方案(WPK和PowerBoots)合并到ShowUI。
New-StackPanel {
New-Button "Set Text Value 1" -On_Click { $textBlock.Text = 1 }
New-Button "Set Text Value 2" -On_Click { $textBlock.Text = 2 }
New-TextBlock -Name textBlock
} -show
由于PowerShell可以强制使用比XAML更多的类型,因此对于快速开发用户界面来说实际上更方便。