2012-02-01 5 views
0

簡単なマウスオーバーとの比較でドラッグされたことに対応して、BorderのスタイルをTriggerで行いたいです。ドラッグイベント中であるかどうかに基づいてトリガーを設定できますか?

具体的には、ハードウェアポート(ポート1、ポート2など)を表示し、そのポートに接続されているデバイスのリストが表示されます。通常のマウスオーバーイベントでは、デバイスを強調表示する必要があります。ただし、ドラッグ・ドロップ操作を行っている場合は、ポートを強調表示する必要があります。

たとえば、私が何をしたいのかを説明するいくつかの偽のMultiTriggersがあります。これはIsDragInProgressというfauxプロパティを使用しています。それが私が達成しようとしていることです。

<DataTemplate x:Key="TestTemplate"> 

    <DockPanel> 

     <Border x:Name="PortHighlight" DockPanel.Dock="Left"> 
      <TextBlock> 
       <Run Text="{Binding PortName}" /> 
       <Run Text=": " /> 
      </TextBlock> 
     </Border> 

     <Border x:Name="DeviceHighlight"> 
      <TextBlock Text="{Binding DeviceName}" /> 
     </Border> 

    </DockPanel> 

    <DataTemplate.Triggers> 

     <MultiTrigger> 

      <MultiTrigger.Conditions> 
       <Condition Property="IsMouseOver" Value="True" /> 
       <Condition Property="IsDragInProgress" Value="False" /> 
      </MultiTrigger.Conditions> 

      <Setter TargetName="DeviceHighlight" Property="Background" Value="Yellow" /> 

     </MultiTrigger> 

     <MultiTrigger> 

      <MultiTrigger.Conditions> 
       <Condition Property="IsMouseOver" Value="True" /> 
       <Condition Property="IsDragInProgress" Value="True" /> 
      </MultiTrigger.Conditions> 

      <Setter TargetName="PortHighlight" Property="Background" Value="Yellow" /> 

     </MultiTrigger> 

    </DataTemplate.Triggers> 

</DataTemplate> 

これは可能ですか?偽物の代わりに私が投票できる既存の財産はありますかIsDragInProgress

+0

OnEnterを試しましたか? – Xcalibur37

+0

私はOnEnterがあなたがドラッグしているかどうかに関係なく、いずれかの方法で起動したとは思わない。プラス、それはイベントではなく、プロパティではありますか?もう一度、ドラッグしているかどうかをテストできるものを探しています。 – MarqueIV

答えて

0

DataTriggerを使用できます。ビューモデルにIsDragInProgressプロパティを作成します。ドラッグを開始したり終了したりするときに、そのプロパティをオン/オフにする必要があります。

編集:分離コードで

<Grid x:Name="LayoutRoot"> 
    <Border x:Name="border" AllowDrop="True" Drop="border_Drop" DragEnter="border_DragEnter" DragLeave="border_DragLeave" Background="White"></Border> 
    <Ellipse Height="50" Width="50" Fill="Green" MouseMove="Ellipse_MouseMove" /> 
</Grid> 

:私の簡単なテストで

private void Ellipse_MouseMove(object sender, MouseEventArgs e) 
    { 
     Ellipse ellipse = sender as Ellipse; 
     if (ellipse != null && e.LeftButton == MouseButtonState.Pressed) 
     { 
      DragDrop.DoDragDrop(ellipse, 
           ellipse.Fill.ToString(), 
           DragDropEffects.Copy); 
     } 
    } 

    private void border_DragEnter(object sender, DragEventArgs e) 
    { 
     border.Background = new SolidColorBrush(Colors.Blue); 
    } 

    private void border_DragLeave(object sender, DragEventArgs e) 
    { 
     border.Background = new SolidColorBrush(Colors.White); 
    } 

    private void border_Drop(object sender, DragEventArgs e) 
    { 
     border.Background = new SolidColorBrush(Colors.White); 
    } 

、これはかなり信頼性の高いように見えました。背景色を変更する代わりに、ビューモデルのプロパティを変更します(DataTriggerを起動します)。

Good Luck!

+0

そのアプローチの問題は、ドラッグを開始するすべてのものがそれを設定する必要があり、ドラッグを終了するすべてがそれをクリアする必要があります。さらに、ドラッグを開始するケースをどのように扱いますか?それを完了する前にドラッグをキャンセルしますか?私は本当にフレームワークに聞いてもらえないことに本当に驚いていますねぇ、ちょっと...誰かが今何かを引っ張っているの? " – MarqueIV

+0

それは問題かもしれません...しかし、私はすぐにコード[ここ](http://msdn.microsoft.com/en-us/library/ms742859.aspx)に基づいてwpfアプリケーションを試しました。 DragEnterでドロップターゲット(Border)領域の色を青に変更し、DragLeaveおよびDropイベントで白に戻しました。それらのイベントを処理するとき、私は青を残すことにそれをだますことができませんでしたが...私はそれが絶対確実だとは言えません...あなたが解決策を見つけることを望みます。 –

+0

退室しない、または降ろすとどうなりますか?私。 Escを押してドラッグをキャンセルしますか?実際には、あなたが参照しているコードを投稿する可能性があります(またはそれを上に更新しますか?) – MarqueIV

関連する問題