2

BlinkingLightという名前のカスタムクラスがあります。静的なObservableCollectionBlinkingLightCollectionもあります。UIには、BlinkingLightCollectionにバインドされたListBoxがあります。

私のリストボックスでは、基本的に各BlinkingLightオブジェクトをカスタムコントロールとして表示したいと思います。このコントロールは、LEDライトが付いたボックスのように見え、LEDが1秒間点滅した後、通常に戻るアニメーションがあります。

私のBlinkingLightクラスには、「Flash」と呼ばれるイベントを発生させるサードパーティの「LED」オブジェクトがあります。

これを機能させるためのアイデアや解決策を探しています!

私の失敗した試み:

BlinkingLightがカスタムコントロールのDataContextである場合に、BlinkingLightクラスのデータにバインドできるカスタムコントロール(BlinkingLightControl)を作成しました。

ListBox用のDataTemplateを作成しました。

<Window.Resources>
  <DataTemplate x:Key="blinkingLightItemTemplate" >
    <local:BlinkingLightControl />
  </DataTemplate>
</Window.Resources>

<ListBox ItemsSource={Binding Source={x:Static local:Data.BlinkingLightCollection}}
         ItemTemplate="{StaticResource blinkingLightItemTemplate}" />

注:カスタムコントロールのxamlをデータテンプレートに配置するだけで、完全に異なるコントロールを使用できるようになります。

ここで、RoutedEventがLED.FlashイベントであるEventTriggerをBlinkingLightControl(またはDataTemplate)に入れたいと思います。残念ながら、私はこの部分を理解できないようです。BlinkingLightクラスでRoutedEventを作成し、LED.Flashイベントを処理するたびにそれを発生させようとしました。ただし、私のクラスはUIElementまたはContentElementではなく、MSDNによると:MSND Link

「ルーティングされたイベントの所有者は任意のクラスにすることができますが、ルーティングされたイベントを使用するには、UIElementまたはContentElementの派生クラスによって発生および処理される必要があります。カスタムイベントの詳細については、「方法:カスタムのルーティングされたイベントを作成する」を参照してください。

どんな助けでも大歓迎です!! ありがとう、スコット

4

3 に答える 3

2

この場合、最良の方法は、WPFコマンドを使用して、「BlinkTheLights」RoutedCommandを作成することです。BlinkingLightControlはBlinkTheLightsコマンドを処理し、ライトを点滅させるStoryBoardを起動して応答します。

于 2009-09-15T02:19:05.890 に答える
2

私は非常にうまく機能した解決策を思いつくことができました:

私のDataTemplateにはカスタムUserControl(DataContextにバインドしてビジネスオブジェクトからデータを取得する)が含まれているだけなので...カスタムRoutedEventをUserControlに配置しました。次に、UserControlのロードされたイベントで、DataContextをビジネスオブジェクトとしてキャストして、イベントを持つビジネスオブジェクトのプロパティにアクセスし、イベントハンドラーに接続します。(私の例では、DataContextをBlinkingLightオブジェクトとしてキャストすると、LedプロパティのFlashイベントにアクセスして、カスタムイベントハンドラーに接続できます)。注:LEDオブジェクトが機能するには、BlinkingLightオブジェクトのフィールドだけでなく、プロパティである必要があります。

次に、イベントハンドラーは、UserControlのカスタムルーテッドイベント(FlashGreenEvent)を発生させることができます。以下は、OPのコードを補足するバックエンドコードです(他の無関係なコードを削除しました)。

public partial class BlinkingLightControl : UserControl
{
    public static readonly RoutedEvent FlashGreenEvent = EventManager.RegisterRoutedEvent("FlashGreen", RoutingStrategy.Direct, typeof(RoutedEventHandler), typeof(BlinkingLightControl));
    public event RoutedEventHandler FlashGreen
    {
        add { AddHandler(FlashGreenEvent, value); }
        remove { RemoveHandler(FlashGreenEvent, value); }
    }

    private void BlinkingLightControl_Loaded(object sender, RoutedEventArgs e)
    {
        BlinkingLight blinkingLight = (BlinkingLight)this.DataContext;

        blinkingLight.Led.Flash += LED_Flash;
    }

    protected delegate void LED_FlashCallback(ThirdParty.LED sender);
    public void LED_Flash(ThirdParty.LED sender)
    {
        if (this.Dispatcher.CheckAccess())
        {
            // Raise the Flash Green Event;
            RaiseEvent(new RoutedEventArgs(BlinkingLightControl.FlashGreenEvent));
        }
        else
            this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new LED_FlashCallback(LED_Flash), sender);
    }
}
于 2009-09-21T20:55:34.857 に答える
1

カスタムコントロールを作成している場合は、いつでもコントロールテンプレートの外部でトリガーを設定できます。

何かのようなもの:

  <Style TargetType="{x:Type local:MyControl}">

  <!-- fade in the control with an animation -->
  <Style.Triggers>
    <EventTrigger RoutedEvent="Control.Loaded">
      <BeginStoryboard>
        <Storyboard>
         <DoubleAnimation To="1" Duration="0:0:1" Storyboard.TargetProperty="Opacity"/>
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Style.Triggers>

  <!-- Make sure the opacity starts at 0 -->
  <Setter Property="Opacity" Value="0"/>
  <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="{x:Type local:MyControl}">
         </ControlTemplate>
      </Setter.Value>
  </Setter>
</Style>
于 2010-05-17T14:50:47.470 に答える