亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

觸發器設置器在更改后不會為 DependencyProperty 設置新值

觸發器設置器在更改后不會為 DependencyProperty 設置新值

C#
慕萊塢森 2023-05-13 15:45:48
我真的試圖找到解決方案,但我失敗了。所以我在單獨的 xaml 文件中有 ResourceDictionary,在另一個 cs 文件中有 Control 類。這是 xaml 代碼:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"                    xmlns:local="clr-namespace:WpfApp1" x:Class="Control1">    <Style TargetType="{x:Type local:Control1}">        <Setter Property="GridColor" Value="Red"/>        <Setter Property="Template">            <Setter.Value>                <ControlTemplate TargetType="{x:Type local:Control1}">                    <Grid>                        <Grid.ColumnDefinitions>                            <ColumnDefinition/>                            <ColumnDefinition/>                        </Grid.ColumnDefinitions>                        <Grid x:Name="PART_Grid" Background="{TemplateBinding GridColor}"                               Height="{TemplateBinding Height}" Width="{TemplateBinding Width}"/>                        <Button Grid.Column="1" x:Name ="PART_Button" Width="50" Height="50"/>                    </Grid>                    <ControlTemplate.Triggers>                        <Trigger Property="IsChecked" Value="True">                            <Setter Property="GridColor" Value="Black"/>                        </Trigger>                    </ControlTemplate.Triggers>                </ControlTemplate>            </Setter.Value>        </Setter>    </Style></ResourceDictionary>在 cs 文件中,我更改了IsChecked事件處理OnMouseEnter程序OnMouseLeave。它工作正常。問題是,例如,當我更改事件處理GridColor程序OnButtonClick時,它會更改,但之后觸發器設置器不起作用(但另一個設置器仍然可以正常工作)。沒有例外,輸出中沒有消息。我錯過了什么?
查看完整描述

1 回答

?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

您似乎遇到了依賴屬性值優先級的問題:在我看來,您正在點擊處理程序中設置本地值(鏈接優先級列表中的#3),并且覆蓋了控件模板設置的值觸發器(優先列表中的#4a)。

您唯一想要混合優先級的情況是當您明確想要替換以默認樣式或基類或類似性質完成的內容時。

但是您的方法無論如何都不是最好的主意:理想情況下,您編寫 WPF 控件就像一個無法訪問源代碼的陌生人將不得不編寫默認樣式和默認模板一樣。然后你像陌生人一樣編寫你的默認模板。模板可能需要知道的任何內容都應該清楚地公開為屬性。

這并不總是可行的,但我將演示如何在這種情況下做到這一點。

藍色畫筆表示一種狀態:按鈕已被點擊。該狀態未顯式存儲或暴露在任何地方,它只是隱含在屬性的值中GridColor(您實際上應該將其命名為GridBrushor?GridBackground,因為它不是Color)。

因此,讓我們為該狀態添加一個只讀依賴屬性,并將有關畫筆顏色的決定推到它所屬的模板中。這真的很強大,因為如果你想讓一些兄弟控件根據我們的狀態改變它的HasBeenClicked狀態,你可以只在父視圖中添加一個綁定。

HasBeenClicked如果您希望控件的使用者能夠以編程方式或通過綁定更改該狀態,您還可以創建一個常規的讀/寫依賴屬性。

//? This is not a good name, but I don't know what your semantics are.?

public bool HasBeenClicked

{

? ? get { return (bool)GetValue(HasBeenClickedProperty); }

? ? protected set { SetValue(HasBeenClickedPropertyKey, value); }

}


internal static readonly DependencyPropertyKey HasBeenClickedPropertyKey =

? ? DependencyProperty.RegisterReadOnly(nameof(HasBeenClicked), typeof(bool), typeof(Control1),

? ? ? ? new PropertyMetadata(false));


public static readonly DependencyProperty HasBeenClickedProperty = HasBeenClickedPropertyKey.DependencyProperty;


private void Button_Click(object sender, RoutedEventArgs e)

{

? ? HasBeenClicked = true;

}

在控制模板中:


<ControlTemplate.Triggers>

? ? <!--?

? ? The last applicable trigger wins: If both are true, GridColor will be Black?

? ? -->

? ? <Trigger Property="HasBeenClicked" Value="True">

? ? ? ? <Setter Property="GridColor" Value="DarkBlue"/>

? ? </Trigger>

? ? <Trigger Property="IsChecked" Value="True">

? ? ? ? <Setter Property="GridColor" Value="Black"/>

? ? </Trigger>

</ControlTemplate.Triggers>


查看完整回答
反對 回復 2023-05-13
  • 1 回答
  • 0 關注
  • 120 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號