0

誰かがこれで私を助けてくれますか? WPF で次のテンプレートを設定しています。

    <Style TargetType="{x:Type Label}" x:Key="NavLink">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate x:Name="NavLinkControlTemplate" TargetType="{x:Type Label}">
                    <Border x:Name="NavLinkBorder">
                        <ContentPresenter x:Name="NavLinkContent" Margin="4,4,4,4" />
                    </Border>

                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="NavLinkBorder" Property="Background" Value="#CCCCCC" />
                            <Setter Property="Cursor" Value="Hand" />
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="False">
                            <Setter TargetName="NavLinkBorder" Property="Background" Value="#EAEAEA" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

プログラムが読み込まれると、ナビゲーション メニューとして機能するラベルのリストが自動的に作成されます。上記からわかるように、ラベルの 1 つにマウスを合わせると、背景色が変更されます。これに関する唯一の問題は、ラベルにコンテキスト メニューが適用されていることです。右クリックして表示すると、ラベルの背景が MouseOver の色ではなく元の色に戻ります。

約 1 時間ほど Google で検索しましたが、マウスの右ボタンが押されたかどうかを確認するトリガー プロパティが見つからないようです。コードでこれを達成できるのではないかと考えています。

次のコードを試しましたが、うまくいきません。

    // this event is being added to each label at runtime...
    tempLabel.MouseRightButtonUp += new MouseButtonEventHandler(NavLink_RightClicked);

    // this is the method that the right-click calls...
    private void NavLink_RightClicked(object sender, EventArgs e)
        {
            if (sender is Label)
            {
                currentContextLink = sender as Label;

                // the below line won't work because the ControlTemplate seems to be overwriting it...
                currentContextLink.Background = new SolidColorBrush(appFunctions.HexToColor("#FF0000"));
            }
        }

また、Label の親要素を Border として取得しようとしましたが、テンプレートを介して設定されているため、Label の親は実際にはすべてのラベルを含む StackPanel であるようです。

誰かが境界線にアクセスして背景色を変更する方法を理解するのを手伝ってくれますか、それともこれを達成するのに役立つ方向に私を案内してくれますか?

どんな助けでも大歓迎です!

4

3 に答える 3

1

追加のデータ トリガーを追加して、バインディングを通じて ContextMenu の IsOpen プロパティを調べることができます。

<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=ContextMenu.IsOpen}" Value="True">
    <Setter TargetName="NavLinkBorder"  Property="Background" Value="#CCCCCC" />
    <Setter Property="Cursor" Value="Hand" />
</DataTrigger>

また、MouseOver="false" トリガーを取り除き、NavLinkBorder に Background="#EAEAEA" をデフォルト値として設定することもできます。これは、アクティブなトリガーがない場合に引き継がれます。

または、境界線の色設定を切り替えてテンプレート バインディングを使用することもできます。これにより、コード メソッドが機能しやすくなります。個々の Label インスタンスに異なる Background 値を設定できるため、テンプレートがより柔軟になるため、とにかくこれを使用することをお勧めします。これは、いくつかの TemplateBindings とコンテキスト メニュー トリガーが追加されたスタイルです。

<Style TargetType="{x:Type Label}" x:Key="NavLink">
    <Setter Property="Background" Value="#EAEAEA" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate x:Name="NavLinkControlTemplate" TargetType="{x:Type Label}">
                <Border x:Name="NavLinkBorder" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <ContentPresenter x:Name="NavLinkContent" Margin="4,4,4,4" />
                </Border>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="NavLinkBorder" Property="Background" Value="#CCCCCC" />
                        <Setter Property="Cursor" Value="Hand" />
                    </Trigger>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=ContextMenu.IsOpen}" Value="True">
                        <Setter TargetName="NavLinkBorder" Property="Background" Value="#CCCCCC" />
                        <Setter Property="Cursor" Value="Hand" />
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
于 2010-07-10T04:20:32.100 に答える
0

ご協力いただきありがとうございますが、私はWPFに少し慣れていないため、RoutedEventsはあまり得意ではありません。あなたが提案したようにコードの最初のセクションを追加しましたが、それを実行すると次のエラーが発生します:

属性「RoutedEvent」の文字列「MouseRightButtonUp」をタイプ「System.Windows.RoutedEvent」のオブジェクトに変換できません。RoutedEventConverterはSystem.Stringから変換できません。マークアップファイル「MyProgram;component/frmmain.xaml」のオブジェクト「System.Windows.EventTrigger」でエラーが発生しました。62行目43行目。

XAMLスタイルコードは次のようになります。

    <Style TargetType="{x:Type Label}" x:Key="NavLink">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Label}">
                    <Border x:Name="NavLinkBorder" Background="#CCCCCC">
                        <ContentPresenter x:Name="NavLinkContent" Margin="4,4,4,4" />
                    </Border>

                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="NavLinkBorder" Property="Background" Value="#CCCCCC" />
                            <Setter Property="Cursor" Value="Hand" />
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="False">
                            <Setter TargetName="NavLinkBorder" Property="Background" Value="#EAEAEA" />
                        </Trigger>
                        <EventTrigger RoutedEvent="MouseRightButtonUp">
                            <BeginStoryboard>
                                <Storyboard>
                                    <ColorAnimation To="#FF0000" Duration="0" Storyboard.TargetName="NavLinkBorder" Storyboard.TargetProperty="(Background).(Color)"  />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

そして、私は以前にこれを投稿しませんでしたが、これは私のラベルを生成するコードのように見えます:

    Label tempLabel = new Label();
    tempLabel.Content = "My Link";
    tempLabel.ContextMenu = (ContextMenu)FindResource("NavContextMenu");
    tempLabel.FontSize = 12;
    tempLabel.Foreground = new SolidColorBrush(appFunctions.HexToColor("#000057"));
    tempLabel.Name = "myNavLink";
    tempLabel.Style = (Style)FindResource("NavLink");

    tempLabel.MouseLeftButtonUp += new MouseButtonEventHandler(NavLink_LeftClicked);
    tempLabel.MouseRightButtonUp += new MouseButtonEventHandler(NavLink_RightClicked);

    navPanel.Children.Add(tempLabel);

エラーが発生すると、上記のコードから次の行が強調表示されます。

    tempLabel.Style = (Style)FindResource("NavLink");

ラベルのスタイルを正しく付けていないのかもしれません...?

于 2010-07-09T20:56:12.563 に答える
0

あなたのスタイルでこれを試してください:

<EventTrigger RoutedEvent="MouseRightButtonUp">
    <BeginStoryboard>
        <Storyboard>
            <ColorAnimation To="#FF0000" Duration="0" Storyboard.TargetName="NavLinkBorder" Storyboard.TargetProperty="(Background).(Color)"  />
        </Storyboard>
    </BeginStoryboard>
</EventTrigger>

<Trigger Property="IsMouseOver" Value="False">マウスを離すと、色が #EAEAEA に戻ることに注意してください。色を「固定」したい場合は、ControlTemplate次のように変更します。

<Border x:Name="NavLinkBorder">
    <Border x:Name="NavLinkInnerBorder" Background="Transparent" >
        <ContentPresenter x:Name="NavLinkContent" Margin="4,4,4,4" />
    </Border>
</Border>

...そして、ColorAnimation を次のように変更します。

<ColorAnimation To="#FF0000" Duration="0" Storyboard.TargetName="NavLinkInnerBorder" Storyboard.TargetProperty="(Background).(Color)"  />
于 2010-07-09T19:19:51.530 に答える