簡體   English   中英

WPF 4.0全局樣式問題

[英]WPF 4.0 Global Style Issue

我開發了WPF應用程序(目標.Net 4.0)。 我這樣定義整體風格

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/BuildingInspector;component/Resources/Languages/fr-FR.xaml" />
            <!--<ResourceDictionary Source="pack://application:,,,/BuildingInspector;component/Resources/ButtonStyles.xaml" />-->
        </ResourceDictionary.MergedDictionaries>

        <ControlTemplate x:Key="ctButton" TargetType="{x:Type telerik:RadButton}">
            <Grid>
                <Border>
                    <Border.Style>
                        <Style TargetType="Border">
                            <Setter Property="BorderThickness" Value="0" />
                            <Setter Property="Background" Value="Transparent" />
                        </Style>
                    </Border.Style>
                </Border>
                <ContentPresenter Content="{Binding Path=(app:DependencyProperties.ImagePath), RelativeSource={RelativeSource AncestorType={x:Type telerik:RadButton}}}" />
            </Grid>
        </ControlTemplate>

        <!-- Style par défault des boutons -->
        <Style x:Key="defaultButtonStyle" TargetType="{x:Type telerik:RadButton}">
            <Setter Property="Template" Value="{DynamicResource ctButton}" />
        </Style>

        <!-- Style du bouton "Add" -->
        <Style x:Key="addButtonStyle" 
               BasedOn="{StaticResource ResourceKey=defaultButtonStyle}" 
               TargetType="{x:Type telerik:RadButton}">
            <Setter Property="app:DependencyProperties.ImagePath" Value="{DynamicResource ResourceKey=pathAdd}" />
            <Setter Property="app:DependencyProperties.Color" Value="LightGreen" />
            <Setter Property="app:DependencyProperties.MouseOverColor" Value="GreenYellow" />
            <Setter Property="app:DependencyProperties.PressedColor" Value="Green" />
        </Style>

        <!-- Style du bouton "Cancel" -->
        <Style x:Key="cancelButtonStyle" 
               BasedOn="{StaticResource ResourceKey=defaultButtonStyle}" 
               TargetType="{x:Type telerik:RadButton}">
            <Setter Property="app:DependencyProperties.ImagePath" Value="{DynamicResource ResourceKey=pathCancel}" />
            <Setter Property="app:DependencyProperties.Color" Value="Salmon" />
            <Setter Property="app:DependencyProperties.MouseOverColor" Value="SandyBrown" />
            <Setter Property="app:DependencyProperties.PressedColor" Value="Red" />
        </Style>

        <!-- Style du bouton "Delete" -->
        <Style x:Key="deleteButtonStyle" 
               BasedOn="{StaticResource ResourceKey=defaultButtonStyle}" 
               TargetType="{x:Type telerik:RadButton}">
            <Setter Property="app:DependencyProperties.ImagePath" Value="{DynamicResource ResourceKey=pathDelete}" />
            <Setter Property="app:DependencyProperties.Color" Value="Salmon" />
            <Setter Property="app:DependencyProperties.MouseOverColor" Value="SandyBrown" />
            <Setter Property="app:DependencyProperties.PressedColor" Value="Red" />
        </Style>

        <!-- Style du bouton "Exit" -->
        <Style x:Key="exitButtonStyle" 
               BasedOn="{StaticResource ResourceKey=defaultButtonStyle}" 
               TargetType="{x:Type telerik:RadButton}">
            <Setter Property="app:DependencyProperties.ImagePath" Value="{DynamicResource ResourceKey=pathExit}" />
            <Setter Property="app:DependencyProperties.Color" Value="Salmon" />
            <Setter Property="app:DependencyProperties.MouseOverColor" Value="SandyBrown" />
            <Setter Property="app:DependencyProperties.PressedColor" Value="Red" />
        </Style>

        <!-- Style du bouton "Next" -->
        <Style x:Key="nextButtonStyle" 
               BasedOn="{StaticResource ResourceKey=defaultButtonStyle}" 
               TargetType="{x:Type telerik:RadButton}">
            <Setter Property="app:DependencyProperties.ImagePath" Value="{DynamicResource ResourceKey=pathNext}" />
            <Setter Property="app:DependencyProperties.Color" Value="LightGreen" />
            <Setter Property="app:DependencyProperties.MouseOverColor" Value="GreenYellow" />
            <Setter Property="app:DependencyProperties.PressedColor" Value="Green" />
        </Style>

        <!-- Style du bouton "Save" -->
        <Style x:Key="saveButtonStyle" 
               BasedOn="{StaticResource ResourceKey=defaultButtonStyle}" 
               TargetType="{x:Type telerik:RadButton}">
            <Setter Property="app:DependencyProperties.ImagePath" Value="{DynamicResource ResourceKey=pathSave}" />
            <Setter Property="app:DependencyProperties.Color" Value="LightGreen" />
            <Setter Property="app:DependencyProperties.MouseOverColor" Value="GreenYellow" />
            <Setter Property="app:DependencyProperties.PressedColor" Value="Green" />
        </Style>


        <!-- Style du Path (contenu) des boutons -->
        <Style x:Key="pathButtonStyle" TargetType="Path">
            <Setter Property="Fill"
                    Value="{Binding Path=(app:DependencyProperties.Color), RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=telerik:RadButton}}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=telerik:RadButton}}"
                             Value="True">
                    <Setter Property="Fill" 
                            Value="{Binding Path=(app:DependencyProperties.MouseOverColor), RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=telerik:RadButton}}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=IsPressed, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=telerik:RadButton}}"
                             Value="True">
                    <Setter Property="Fill"
                            Value="{Binding Path=(app:DependencyProperties.PressedColor), RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=telerik:RadButton}}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=IsEnabled, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=telerik:RadButton}}"
                             Value="False">
                    <Setter Property="Fill"
                            Value="{Binding Path=(app:DependencyProperties.DisabledColor), RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=telerik:RadButton}}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>


        <!-- Contenu du bouton "Add" -->
        <Grid x:Key="pathAdd">
            <Grid Name="addBackgroundGrid" MinWidth="48" MinHeight="48" Visibility="Collapsed" />
            <Path Data="M2.880352,35.504997L25.563028,35.504997 25.461889,35.77055C24.680614,37.90033 24.254,40.199783 24.254,42.596951 24.254,44.994007 24.680614,47.293259 25.461889,49.422794L25.562908,49.688 2.880352,49.688C1.290522,49.688,3.8410201E-07,48.396416,0,46.807915L0,38.38258C3.8410201E-07,36.794079,1.290522,35.504997,2.880352,35.504997z M41.691601,32.867001L41.691601,40.591217 33.968002,40.591217 33.968002,45.48729 41.691601,45.48729 41.691601,53.211002 46.587406,53.211002 46.587406,45.48729 54.311005,45.48729 54.311005,40.591217 46.587406,40.591217 46.587406,32.867001z M44.126499,27.625C52.394669,27.625 59.098,34.325611 59.098,42.596501 59.098,50.859093 52.394669,57.565003 44.126499,57.565003 35.858036,57.565003 29.156,50.859093 29.156,42.596501 29.156,34.325611 35.858036,27.625 44.126499,27.625z M2.880352,17.594002L43.182121,17.594002C44.771912,17.594002,46.061001,18.882946,46.061001,20.471779L46.061001,22.816408 45.653107,22.780068C45.149128,22.741593 44.639954,22.722 44.126297,22.722 37.278214,22.722 31.227619,26.205 27.652683,31.492657L27.472803,31.773003 2.880352,31.773003C1.290522,31.773001,3.8410201E-07,30.484057,8.8062882E-07,28.893322L8.8062882E-07,20.471779C3.8410201E-07,18.882946,1.290522,17.594002,2.880352,17.594002z M8.4794798,3.8200022C6.678607,3.8200022 5.2110004,5.2864023 5.2110014,7.0887662 5.2110004,8.8935586 6.678607,10.357 8.4794798,10.357 10.281624,10.357 11.748,8.8935586 11.748,7.0887662 11.748,5.2864023 10.281624,3.8200022 8.4794798,3.8200022z M2.880352,0L43.182117,0C44.771912,5.590332E-07,46.061001,1.2890898,46.061001,2.8779911L46.061001,11.302441C46.061001,12.893875,44.771912,14.18,43.182117,14.18L2.880352,14.18C1.290522,14.18,3.8410201E-07,12.893875,0,11.302441L0,2.8779911C3.8410201E-07,1.2890898,1.290522,5.590332E-07,2.880352,0z" 
                  Stretch="Uniform" Width="26" Height="26" Margin="0,0,0,0" RenderTransformOrigin="0.5,0.5"
                  Style="{DynamicResource ResourceKey=pathButtonStyle}">
                <Path.RenderTransform>
                    <TransformGroup>
                        <TransformGroup.Children>
                            <RotateTransform Angle="0" />
                            <ScaleTransform ScaleX="1" ScaleY="1" />
                        </TransformGroup.Children>
                    </TransformGroup>
                </Path.RenderTransform>
            </Path>
        </Grid>

        <!-- Contenu du bouton "Cancel" -->
        <Grid x:Key="pathCancel">
            <Grid Name="cancelBackgroundGrid" Width="48" Height="48" Visibility="Collapsed" />
            <Path Data="M2.9505676,36.439814L21.343939,36.439814C20.303749,39.110218 19.703638,42.000652 19.703638,45.041111 19.703638,47.101423 19.993691,49.091722 20.493784,50.992008L2.9505676,50.992008C1.3202689,50.992008,2.6905189E-05,49.67181,2.6147463E-05,48.041565L2.6147463E-05,39.400261C2.6905189E-05,37.760014,1.3202689,36.439814,2.9505676,36.439814z M43.691771,27.403506C43.883024,27.398506,44.075529,27.398506,44.270537,27.403506L44.280539,27.403506 44.300539,27.403506C46.750612,27.423509,49.070685,27.943573,51.18075,28.873688L51.25075,28.913692C57.48094,31.684034 61.801073,37.954807 61.73107,45.205702 61.631067,54.946903 53.660826,62.767868 43.920527,62.667858 36.320295,62.587849 29.900101,57.707245 27.500027,50.946411L33.810221,49.846275C35.580275,53.706753 39.450392,56.407085 43.980528,56.457092 50.230719,56.517097 55.340876,51.496479 55.400877,45.245708 55.470881,39.004938 50.450728,33.884306 44.200537,33.824298 43.670519,33.824298 43.150503,33.864304 42.64049,33.924311L42.630488,33.884306C40.950438,34.104332,39.390391,34.694407,38.030348,35.584515L40.200415,37.634769C40.33042,37.754784 40.380419,37.944807 40.310415,38.104826 40.250414,38.274847 40.100412,38.384861 39.920405,38.394863L34.650244,38.674896 29.970102,38.924927 29.940102,38.924927C29.810097,38.924927 29.700094,38.86492 29.61009,38.77491 29.520088,38.674896 29.480087,38.54488 29.510088,38.404863L30.260111,34.234348 31.340143,28.333621C31.370144,28.153599 31.500149,28.013581 31.670155,27.983578 31.850159,27.943573 32.030165,28.013581 32.130167,28.1636L33.86022,30.703914C36.260294,28.9737 39.11038,27.853561 42.200476,27.513519 42.240477,27.503518 42.280478,27.503518 42.320479,27.503518 42.590487,27.473515 42.850496,27.453512 43.120504,27.43351 43.310507,27.418509 43.500513,27.408506 43.691771,27.403506z M2.9499468,18.059961L44.308165,18.059961C45.938101,18.059961,47.268,19.380206,47.268,21.020318L47.268,21.830486C45.968126,21.610486 44.638106,21.470574 43.278181,21.470575 34.818579,21.470574 27.428881,25.931133 23.269024,32.611961L2.9499468,32.611961C1.3200119,32.611961,-1.251392E-07,31.291716,0,29.661614L0,21.020318C-1.251392E-07,19.380206,1.3200119,18.059961,2.9499468,18.059961z M8.6996557,3.927825C6.8497344,3.927825 5.3397986,5.4269943 5.3397986,7.2759705 5.3397986,9.1249466 6.8497344,10.634111 8.6996557,10.634111 10.549576,10.634111 12.049512,9.1249466 12.049512,7.2759705 12.049512,5.4269943 10.549576,3.927825 8.6996557,3.927825z M2.949901,0L44.308134,0C45.938063,0,47.268007,1.3292637,47.268007,2.9583616L47.268007,11.603574C47.268007,13.232672,45.938063,14.551941,44.308134,14.551941L2.949901,14.551941C1.3199705,14.551941,2.6895254E-05,13.232672,2.6147463E-05,11.603574L2.6147463E-05,2.9583616C2.6895254E-05,1.3292637,1.3199705,0,2.949901,0z" 
                  Stretch="Uniform" Width="26" Height="26" Margin="0,0,0,0" RenderTransformOrigin="0.5,0.5"
                  Style="{DynamicResource ResourceKey=pathButtonStyle}" >
                <Path.RenderTransform>
                    <TransformGroup>
                        <TransformGroup.Children>
                            <RotateTransform Angle="0" />
                            <ScaleTransform ScaleX="1" ScaleY="1" />
                        </TransformGroup.Children>
                    </TransformGroup>
                </Path.RenderTransform>
            </Path>
        </Grid>

        <!-- Contenu du bouton "Delete" -->
        <Grid x:Key="pathDelete">
            <Grid Name="deleteBackgroundGrid" Width="48" Height="48" Visibility="Collapsed" />
            <Path Data="M2.8803511,35.504998L25.562742,35.504998 25.461922,35.769711C24.680624,37.899521 24.254,40.199002 24.254,42.596199 24.254,44.993397 24.680624,47.292763 25.461922,49.42239L25.563091,49.688 2.8803511,49.688C1.2905214,49.688,-1.9703777E-07,48.395962,2.2562905E-14,46.807518L2.2562905E-14,38.382981C-1.9703777E-07,36.794033,1.2905214,35.504998,2.8803511,35.504998z M38.677929,34.116001L35.216003,37.578362 40.677326,43.039303 35.216003,48.500141 38.677929,51.962002 44.139351,46.501164 49.600777,51.962002 53.062004,48.500141 47.600876,43.039303 53.062004,37.578362 49.600777,34.116001 44.139351,39.576943z M44.126499,27.625C52.394669,27.625 59.098,34.325222 59.098,42.596249 59.098,50.859478 52.394669,57.564999 44.126499,57.564999 35.858036,57.564999 29.156,50.859478 29.156,42.596249 29.156,34.325222 35.858036,27.625 44.126499,27.625z M2.8803511,17.594002L43.182117,17.594002C44.771912,17.594002,46.061001,18.883038,46.061001,20.471483L46.061001,22.815359 45.653645,22.779068C45.149654,22.740591 44.640469,22.720999 44.126797,22.720999 37.278542,22.720999 31.227795,26.204043 27.652769,31.491766L27.471674,31.774002 2.8803511,31.774002C1.2905214,31.774002,-1.9703777E-07,30.484967,2.2562905E-14,28.893622L2.2562905E-14,20.471483C-1.9703777E-07,18.883038,1.2905214,17.594002,2.8803511,17.594002z M8.4794798,3.8200004C6.6786065,3.82 5.211,5.2858002 5.2109985,7.0880244 5.211,8.8926909 6.6786065,10.356001 8.4794798,10.356001 10.281624,10.356001 11.748,8.8926909 11.748,7.0880244 11.748,5.2858002 10.281624,3.82 8.4794798,3.8200004z M2.8803511,0L43.182117,0C44.771912,1.7200194E-07,46.061001,1.2890874,46.061001,2.8775013L46.061001,11.302039C46.061001,12.893373,44.771912,14.18,43.182117,14.180001L2.8803511,14.180001C1.2905214,14.18,-1.9703777E-07,12.893373,2.2562905E-14,11.302039L2.2562905E-14,2.8775013C-1.9703777E-07,1.2890874,1.2905214,1.7200194E-07,2.8803511,0z" 
                  Stretch="Uniform" Width="26" Height="26" Margin="0,0,0,0" RenderTransformOrigin="0.5,0.5"
                  Style="{DynamicResource ResourceKey=pathButtonStyle}">
                <Path.RenderTransform>
                    <TransformGroup>
                        <TransformGroup.Children>
                            <RotateTransform Angle="0" />
                            <ScaleTransform ScaleX="1" ScaleY="1" />
                        </TransformGroup.Children>
                    </TransformGroup>
                </Path.RenderTransform>
            </Path>
        </Grid>

        <!-- Contenu du bouton "Exit" -->
        <Grid x:Key="pathExit">
            <Grid Name="exitBackgroundGrid" Width="48" Height="48" Visibility="Collapsed" />
            <Path Data="M34.201,35.752792L36.154999,37.072937 36.154999,61.028999 26.27,61.028999 26.27,58.465 34.201,58.465z M18.94405,30.222998C17.962244,30.222998 17.167,31.018967 17.167,32.00045 17.167,32.982033 17.962244,33.778 18.94405,33.778 19.925556,33.778 20.721001,32.982033 20.721001,32.00045 20.721001,31.018967 19.925556,30.222998 18.94405,30.222998z M44.257435,25.653L44.257435,29.183289 51.842999,29.183289 51.842999,35.705292 44.257435,35.705292 44.257435,39.237999 34.201,32.444984z M26.27,3.8619995L36.154999,3.8619995 36.154999,27.81745 34.201,29.137484 34.201,6.2989998 26.27,6.2989998z M24.27,0L24.27,64 0,60 0,4.0000029z" 
                  Stretch="Uniform" Width="26" Height="26" Margin="0,0,0,0" RenderTransformOrigin="0.5,0.5"
                  Style="{DynamicResource ResourceKey=pathButtonStyle}">
                <Path.RenderTransform>
                    <TransformGroup>
                        <TransformGroup.Children>
                            <RotateTransform Angle="0" />
                            <ScaleTransform ScaleX="1" ScaleY="1" />
                        </TransformGroup.Children>
                    </TransformGroup>
                </Path.RenderTransform>
            </Path>
        </Grid>

        <!-- Contenu du bouton "Save" -->
        <Grid x:Key="pathNext">
            <Grid Name="nextBackgroundGrid" Width="48" Height="48" Visibility="Collapsed" />
            <Path Data="F1M1568.35,1934.42L1551.46,1917.44 1551.46,1925.43C1517.67,1925.43 1515.02,1945.4 1515.02,1949.39 1522.31,1933.42 1551.46,1941.4 1551.46,1941.4L1551.46,1949.39 1568.35,1934.42z" 
                  Stretch="Uniform" Width="26" Height="26" Margin="0,0,0,0" RenderTransformOrigin="0.5,0.5"
                  Style="{DynamicResource ResourceKey=pathButtonStyle}">
                <Path.RenderTransform>
                    <TransformGroup>
                        <TransformGroup.Children>
                            <RotateTransform Angle="0" />
                            <ScaleTransform ScaleX="1" ScaleY="1" />
                        </TransformGroup.Children>
                    </TransformGroup>
                </Path.RenderTransform>
            </Path>
        </Grid>

        <!-- Contenu du bouton "Save" -->
        <Grid x:Key="pathSave">
            <Grid Name="savebackgroundGrid" Width="48" Height="48" Visibility="Collapsed" />
            <Path Data="M8.1099597,36.94997L8.1099597,41.793968 39.213959,41.793968 39.213959,36.94997z M12.42,0.049999889L18.4,0.049999889 18.4,12.252 12.42,12.252z M0,0L7.9001866,0 7.9001866,14.64218 39.210766,14.64218 39.210766,0 47.401001,0 47.401001,47.917 0,47.917z" 
                  Stretch="Uniform" Width="26" Height="26" Margin="0,0,0,0" RenderTransformOrigin="0.5,0.5"
                  Style="{DynamicResource ResourceKey=pathButtonStyle}">
                <Path.RenderTransform>
                    <TransformGroup>
                        <TransformGroup.Children>
                            <RotateTransform Angle="0" />
                            <ScaleTransform ScaleX="1" ScaleY="1" />
                        </TransformGroup.Children>
                    </TransformGroup>
                </Path.RenderTransform>
            </Path>
        </Grid>
    </ResourceDictionary>
</Application.Resources>

我像這樣消耗它們:

<telerik:RadButton x:Name="rbCancel"
                               MinWidth="48" MinHeight="48" 
                               Style="{DynamicResource ResourceKey=cancelButtonStyle}"/>

我這樣打開對話框:

wpfMaintenanceInspectionType wnd = new wpfMaintenanceInspectionType();
        wnd.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
        wnd.ShowDialog();
        wnd = null;

因此,我第一次顯示對話框時,一切正常,但是下次, pathButtonStyle不再起作用。 啟用后,將鼠標懸停在按鈕上,不會發生任何反應

我的代碼有什么問題?

-更新1-

如果將樣式放在ResourceDictionary文件(ButtonStyles.xaml)中,然后將其添加到他的ctor對話框中,則效果很好。

ResourceDictionary dic = new ResourceDictionary();
        Uri u = new Uri("pack://application:,,,/BuildingInspector;component/Resources/ButtonStyles.xaml", UriKind.Absolute);
        dic.Source = u;
        this.Resources.MergedDictionaries.Add(dic);

為什么它不能與app.xaml中定義的樣式一起使用?

---更新2 ---該對話框從基類appClass:CBIBaseRadWindow構建,並且基類繼承自RadWindow public partial class CBIBaseRadWindow : RadWindow

---更新3 ---我嘗試了一件新的事情:我創建了一個新對話框,只有一個按鈕,單擊該按鈕會創建此新對話框的新實例。 結果:

在開始時,第一個實例運行良好,圖像出現並且觸發器(IsPressed,IsMouseOver)運行良好。一旦我單擊按鈕,就會出現一個包含圖像的新對話框,但是:-觸發器在此對話框上不起作用-第一個實例上的圖像消失-第一個實例上的觸發器應用於第二個實例(如果我按了第一個實例的按鈕,則第二個實例上的顏色發生了變化)

好像該樣式無法應用於多個實例??

---更新4 --- WPF中依賴項屬性的內部知識閱讀本文之后,我認為問題出在我的依賴項屬性上。 它們以全局樣式定義:

<Style x:Key="cancelButtonStyle" 
               BasedOn="{StaticResource ResourceKey=defaultButtonStyle}" 
               TargetType="{x:Type telerik:RadButton}">
            <Setter Property="app:DependencyProperties.ImagePath" Value="{DynamicResource ResourceKey=pathCancel}" />
            <Setter Property="app:DependencyProperties.Color" Value="Salmon" />
            <Setter Property="app:DependencyProperties.MouseOverColor" Value="SandyBrown" />
            <Setter Property="app:DependencyProperties.PressedColor" Value="Red" />
        </Style>

因此,也許,一旦創建了第二個實例,第一個實例就會丟失一些東西。

有人可以確認/確認嗎?

謝謝

我認為您不想在“取消”按鈕樣式中使用DynamicResource DynamicResource更改為StaticResource

請查看此堆棧溢出問題以進一步說明:

WPF中的StaticResource和DynamicResource有什么區別?

暫無
暫無

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

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