在xaml标记内设置事件处理程序方法

时间:2013-12-18 09:20:05

标签: wpf xaml

有没有机会在xaml中设置事件处理程序而不使用c#,powershell等? 例如,我想在点击后设置另一个控件的文本。下面是我想要做的“伪代码”:

<Button Content="Set value = text1" OnClick="txt1.Text = text1" />
<Button Content="Set value = text2" OnClick="txt1.Text = text2" />
<Textbox Name="txt1" />

4 个答案:

答案 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更多的类型,因此对于快速开发用户界面来说实际上更方便。

相关问题