簡體   English   中英

C#運行時更改WPF動態資源

[英]C# Runtime change WPF Dynamic Resource

我在更改控件上的動態資源樣式時遇到問題(在示例中,它是一個日期選擇器,但我想針對許多不同的控件進行更改)。 我有一種啟用樣式,一種禁用樣式,禁用樣式基於已啟用樣式。 這可以治療。 我希望能夠在單擊按鈕時更改樣式(將其啟用為禁用,反之亦然),但是在進行一些搜索之后,我想出的代碼不起作用。

這是資源字典中的XAML

<!--DatePicker Resource-->
<Style x:Key="appDatePicker" TargetType="{x:Type DatePicker}">
    <Setter Property="FontFamily" Value="{Binding Source={StaticResource userSettings}, Path=Default.userFontFamily}" />
    <Setter Property="FontSize" Value="{Binding Source={StaticResource userSettings}, Path=Default.userFontNormalSize}" />
    <Setter Property="Height" Value="Auto" />
    <Setter Property="MinWidth" Value="{Binding Source={StaticResource userSettings}, Path=Default.userControlWidth}" />
    <Setter Property="Background" Value="{Binding Source={StaticResource userSettings}, Path=Default.userControlBackground}" />
    <Setter Property="IsEnabled" Value="True"/>
</Style>

<!--DatePicker Disabled Resource-->
<Style x:Key="appDatePickerDisabled" TargetType="{x:Type DatePicker}" BasedOn="{DynamicResource appDatePicker}">
    <Setter Property="IsEnabled" Value="False"/>
</Style>

這是將其更改為禁用樣式的背后代碼:

datepickerEDP.SetResourceReference(Control.StyleProperty, "appDatePickerDisabled");

和啟用樣式

datepickerEDP.SetResourceReference(StyleProperty, "appDatePicker");

運行此代碼時出現的錯誤是

發生System.Windows.Markup.XamlParseException HResult = -2146233087 LineNumber = 0 LinePosition = 0消息=無法在“樣式”類型的“ BasedOn”屬性上設置“ DynamicResourceExtension”。 “ DynamicResourceExtension”只能在DependencyObject的DependencyProperty上設置。
Source = PresentationFramework StackTrace:在MS.Internal.Helper.CheckCanReceiveMarkupExtension(MarkupExtension markupExtension,IServiceProvider serviceProvider,DependencyObject&targetDependencyObject,DependencyProperty&targetDependencyProperty)內部異常:

對我來說,這表明我不能使用基於樣式,但是即使我更改了禁用樣式以包括已啟用樣式中的所有內容並刪除了BasedOn標簽,它仍然會失敗。 有誰知道我要去哪里錯了? 這確實是在:(

您實際上並不想更改資源引用。 改用觸發器:

<Style x:Key="appDatePicker" TargetType="{x:Type DatePicker}">
    <Setter Property="FontFamily" Value="{Binding Source={StaticResource userSettings}, Path=Default.userFontFamily}" />
    <Setter Property="FontSize" Value="{Binding Source={StaticResource userSettings}, Path=Default.userFontNormalSize}" />
    <Setter Property="Height" Value="Auto" />
    <Setter Property="MinWidth" Value="{Binding Source={StaticResource userSettings}, Path=Default.userControlWidth}" />
    <Setter Property="Background" Value="{Binding Source={StaticResource userSettings}, Path=Default.userControlBackground}" />
    <Setter Property="IsEnabled" Value="True"/>
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Foreground" Value="..."/>
        </Trigger>
    </Style.Triggers>
</Style>

如果要基於某些條件以編程方式更改IsEnabled屬性的值,請綁定到實現INotifyPropertyChanged的后備屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM