3

ViewModelのコマンドにバインドされているボタンがDataTemplateにあります。ボタンには、編集コントロール(ボタンがその一部である)を非表示にするストーリーボードを開始するEventTriggerもあります。

PreviewMouseDownイベントを取得すると、ストーリーボードは正常に機能しますが、コマンドが呼び出されることはありません。EventTriggerでMouseDownイベントを取得すると、コマンドは機能しますが、ストーリーボードは実行されません。

ボタンがクリックされたときにコマンドとストーリーボードの両方を実行するにはどうすればよいですか?

<Button Content="Save" Command="{Binding SaveCommand}" >
    <Button.Triggers>
        <EventTrigger RoutedEvent="Button.PreviewMouseDown">
            <EventTrigger.Actions>
                <BeginStoryboard Storyboard="{DynamicResource sbCloseTitleEdit}"/>
            </EventTrigger.Actions>
        </EventTrigger>
    </Button.Triggers>
</Button>
4

3 に答える 3

1

DataTemplateを含むResourceDictionaryのコードビハインドファイルを追加することで、問題をエレガントに解決することができませんでした。私はこれが可能であることに気づいていませんでしたが、この説明を見つけました:

イベント処理のためにWPFのリソースディクショナリの背後にコードを設定することは可能ですか?

EventTriggerを使用して、編集コントロールを非表示にするストーリーボードを開始する代わりに、コードビハインドにクリックハンドラーを追加しました。クリックされたボタンを基準にしてパネルを配置する必要があるため、少し扱いに​​くいです。これが利用可能な唯一の参照ですが、機能します。

誰かがそれを持っているなら、まだより良い解決策を探しています。

于 2010-10-12T18:51:29.660 に答える
1

私はあなたのコードを試しましたが、イベントトリガーをオンPreviewMouseDownにすると問題なく動作することがわかりました。コマンドが最初に実行され、次にアニメーションが起動するだけです。

ここに私のリソースがあります

<Storyboard x:Key="sbCloseTitleEdit">
  <ColorAnimation Storyboard.TargetProperty="(Rectangle.Fill).Color" 
                  To="Blue" Duration="0:0:3" Storyboard.TargetName="rect" >
  </ColorAnimation>
</Storyboard>

私のxaml

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="Auto" />
  </Grid.ColumnDefinitions>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
  </Grid.RowDefinitions>
  <Button Content="Save" Command="{Binding SaveCommand}" >
    <Button.Triggers>
      <EventTrigger RoutedEvent="Button.PreviewMouseDown">
        <EventTrigger.Actions>
          <BeginStoryboard 
            Storyboard="{StaticResource sbCloseTitleEdit}"/>
        </EventTrigger.Actions>
      </EventTrigger>
    </Button.Triggers>
  </Button>
  <Rectangle Name="rect" Width="30" Height="30" 
             Grid.Column="1" Fill="Red" />
</Grid>

と私のビューモデル

public class MainViewModel
{
    public ActionCommand SaveCommand { get; private set; }
    public MainViewModel()
    {
        SaveCommand = new ActionCommand();
    }
}

public class ActionCommand : ICommand
{
    public void Execute(object parameter)
    {
        // gets fired if event trigger is preview mode
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;
}

何かを見逃していないと思いますか?

于 2010-12-10T09:50:16.670 に答える
0

これは、eventtrigger内のコマンドを、トリガーする他のアクションとともに呼び出すことで実現しました。

<Button Command="{Binding AcceptCommand}" Content="Accept">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="Click">
      <i:InvokeCommandAction Command="{Binding AcceptCommand}"/>
      <triggers:UpdatePropertyAction TargetObject="{Binding RelativeSource={RelativeSource AncestorType={x:Type Controls:ChildWindow}, Mode=FindAncestor}}" TargetProperty="DialogResult" Value="True"  />
    </i:EventTrigger>
  </i:Interaction.Triggers>
</Button>
于 2013-11-08T20:02:44.393 に答える