0

私は.Netに移行するAccess開発者であり、WPFプロジェクトがあります。私はAccessのサブフォームに慣れているので、このように動作するユーザーコントロールを作成しました(それ自体が問題になる可能性がありますが、現時点では対処していません)。

この特定のユーザーコントロール(サブフォーム)には、コードビハインドのオブジェクトにバインドされたいくつかのリストボックスがあります(VB-私もその議論に参加していません;私はVBAに精通しています)。これらのリストボックスは、「IsAssigned」と呼ばれるブール値にバインドされています。これらのリストボックスの項目を、その値に応じて緑がかった色または赤みがかった色に変更するスタイルを作成しました。これは機能しています。

次に、値を変更してウィンドウのハイライト動作をオーバーライドしたいと思い、SystemColors.HighlightColorとControlBrushKeyについて学びました。問題は、HighlightColorとControlBrushKeyの色を「IsAssigned」の値に依存させたいということです。何かが欠けていない限り、トリガーをネストすることはできないようです。次のコードでは、これを理解している場所を示すために、ハイライト値を緑に設定しています。

したがって、アイテムを選択すると、テキストが太字になり、境界線が黒になり、「IsAssigned」の値に応じて緑または赤の単色が維持されます。同じアイテムがハイライトされたアイテムである場合、フォアカラーを白にし、境界線を太くしたいと思います。

優しくしてください-私は1つ以上の点で初心者です。

<UserControl.Resources>
    <Style TargetType="{x:Type ListBoxItem}" x:Key="ColorTrueAndFalse">
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightColor}" Color="Green" />
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Green" />
        </Style.Resources>
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="true">
                <Setter Property="FontWeight" Value="Bold" />
                <Setter Property="BorderBrush" Value="Black" />
            </Trigger>
            <DataTrigger Binding="{Binding IsAssigned}" Value="True">
                <Setter Property="Background">
                    <Setter.Value>
                        <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                            <GradientStop Color="LightGreen" Offset="0" />
                            <GradientStop Color="Green" Offset="1" />
                            <GradientStop Color="LawnGreen" Offset="2" />
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding IsAssigned}" Value="False">
                <Setter Property="Background">
                    <Setter.Value>
                        <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                            <GradientStop Color="LightCoral" Offset="0.5" />
                            <GradientStop Color="Coral" Offset="1" />
                            <GradientStop Color="Red" Offset="2" />
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>
4

2 に答える 2

2

DataContextはそれ自体ListBoxItemのものとは異なりListBoxます。のスタイル{Binding IsAssigned}内で使用する場合、と同じものを使用していないため、プロパティを見つけることができません。ListBoxItemDataContextListBox

これは、相対バインディングを使用して簡単に修正できます-例:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}, Path=DataContext.IsAssigned}" Value="true">

これは、ListBoxItemsの親にバインドしようとします。ListBoxが見つかるまでビジュアルツリーを上に移動し、前者のDataContextプロパティを使用してIsAssignedを見つけようとします。

したがって、完全なソリューションは次のようになります。

<Style.Triggers>
    <Trigger Property="IsSelected" Value="true">
            <Setter Property="FontWeight" Value="Bold" />
            <Setter Property="BorderBrush" Value="Black" />
    </Trigger>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}, Path=DataContext.IsAssigned}" Value="true">
        <Setter Property="Background">
          ....
        </Setter>
    </DataTrigger>

更新-強調表示用:

最初に、ハイライトブラシの名前がHighlightBrushKeyあなたが書いたものではないことに注意してください。

<Style.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Green" />

2番目-使用したのではなく、Triggerこれを使用しDataTriggerて、選択したアイテムのプロパティを変更します。

<DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Self}}" Value="True">
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="BorderBrush" Value="Black" />
</DataTrigger>
于 2012-12-30T08:39:03.227 に答える
1

私が残した小さな髪をたくさん引き出し、Blachshmaから正しい方向にいくつかの指針を示した後、私は解決策を思いつきました。これは主に、ここにあるマークアップに基づいています

HighlightBrushKeyとControlBrushKeyは私に悲しみを与えていました-データトリガーによってすでに設定されている基本的な色を認識させることができませんでした。静的な色に設定することはできましたが、動的な色には設定できませんでした。おそらくもっと多くの時間を投資すれば、これはうまくいったでしょう。代わりに、境界線を使用してデータトリガーの色を設定し、選択したアイテムのフォントと不透明度を変更しました。あるリストボックスでアイテムを選択し、別のリストボックスで別のアイテムを選択するために移動した後でも、境界線の色は同じままでした。これはまさに私が望んでいたことです。

これが私のXAMLです(簡潔にするために特定の詳細は省略されています):

<UserControl.Resources>
    <Style TargetType="{x:Type ListBoxItem}" x:Key="BorderTrueAndFalse">
        <Style.Resources>
            <LinearGradientBrush x:Key="TrueBrush" EndPoint="1,0.5" StartPoint="0,0.5">
                ...
            </LinearGradientBrush>
            <LinearGradientBrush x:Key="FalseBrush" EndPoint="0,0.5" StartPoint="1,0.5">
                ...
            </LinearGradientBrush>
        </Style.Resources>
        <Setter Property="FocusVisualStyle" Value="{x:Null}"></Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Border  Name="Border" Padding="2" SnapsToDevicePixels="true">
                            <ContentPresenter />
                    </Border>
                    <ControlTemplate.Triggers>
                        <DataTrigger Binding="{Binding IsAssigned}" Value="True">
                            <Setter TargetName="Border" Property="Background" Value="{StaticResource TrueBrush}"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding IsAssigned}" Value="False">
                            <Setter TargetName="Border" Property="Background" Value="{StaticResource FalseBrush}"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Self}}" Value="True">
                            <Setter Property="FontWeight" Value="Bold" />
                            <Setter Property="Foreground" Value="White"/>
                            <Setter Property="Opacity" Value=".8"/>
                        </DataTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

もちろん、私はここで何が起こっているのかを80%確信していると思いますが、このプロセスにより、バインディング、トリガー、スタイル、テンプレート、およびAccessのものが非常に高速に開発される理由についての理解が深まりました。いつかテキストをスピン、フラッシュ、そして立ち上がって小さなジグをするように設定するかもしれませんが、今のところ私は幸せなキャンピングカーです。

于 2012-12-31T13:34:35.690 に答える