2008-12-16 305 views
6

我有一個按鈕查看2個組合框,以確保它們在啓用前有一個值。問題是我在做的是覆蓋在我的主題項目中聲明的默認樣式。基於組合框選擇的WPF按鈕IsEnabled覆蓋默認樣式

<Button x:Name="btnOK" VerticalAlignment="Center" Content="OK" IsDefault="True" Margin="0" Click="btnOK_Click"> 
        <Button.Style> 
         <Style BasedOn="{StaticResource DefaultButton}"> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding ElementName=ddlWageTypes, Path=SelectedItem}" Value="{x:Null}"> 
            <Setter Property="Button.IsEnabled" Value="false"/> 
           </DataTrigger> 
           <DataTrigger Binding="{Binding ElementName=ddlJobTitles, Path=SelectedItem}" Value="{x:Null}"> 
            <Setter Property="Button.IsEnabled" Value="false"/> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Button.Style> 
       </Button> 

我試着將支持算法FMP =「{StaticResouce MyDefaultButtonStyleName}」的風格標籤,但它在運行時炸燬。

錯誤是''System.Windows.Style'的值不能被賦值給對象'System.Windows.Controls.Button'的屬性'Style'。只能基於一個帶有基類型'對象'System.Windows.Style'在標記文件中的錯誤「

是否有在XAML中執行此操作而不覆蓋默認樣式的問題。

編輯:代碼示例已更新。 我在OKButtonStyle上收到一條錯誤,說「無法將元素添加到屬性'資源',因爲如果該屬性使用顯式集合標籤,則該屬性只能有一個子元素。」標記文件中對象'System.Windows.Style'的錯誤「

<UserControl x:Class="UK.Budgeting.XBAP.ShiftDiff.NewFTEPremiumPaySummary" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:compModel="clr-namespace:System.ComponentModel;assembly=WindowsBase" 
    xmlns:local="clr-namespace:UK.Budgeting.XBAP.ShiftDiff"> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="CellTemplates.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 

     <Style TargetType="{x:Type Button}" x:Key="OKButtonStyle" BasedOn="{StaticResource DefaultButton}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ElementName=ddlWageTypes, Path=SelectedItem}" Value="{x:Null}"> 
      <Setter Property="Button.IsEnabled" Value="false"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding ElementName=ddlJobTitles, Path=SelectedItem}" Value="{x:Null}"> 
      <Setter Property="Button.IsEnabled" Value="false"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 

    </UserControl.Resources> 
    <Grid> 
     <Rectangle Style="{StaticResource DialogRectangle}"/> 
     <Border Style="{StaticResource DialogBorder}"> 
      <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Background="White"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition/> 
        <ColumnDefinition Width="5"/> 
        <ColumnDefinition MinWidth="300"/> 
       </Grid.ColumnDefinitions> 
       <Grid.RowDefinitions> 
        <RowDefinition/> 
        <RowDefinition Height="2"/> 
        <RowDefinition/> 
        <RowDefinition Height="2"/> 
        <RowDefinition/> 
        <RowDefinition Height="2"/> 
        <RowDefinition/> 
       </Grid.RowDefinitions> 

       <TextBlock Grid.Column="0" Grid.Row="0" Style="{StaticResource LabelStyle}">Wage Type</TextBlock> 
       <TextBlock Grid.Column="0" Grid.Row="2" Style="{StaticResource LabelStyle}">Job Title</TextBlock> 

       <ComboBox x:Name="ddlWageTypes" VerticalAlignment="Top" Grid.Column="2" Grid.Row="0" 
          DisplayMemberPath="DisplayName" 
          SelectedValuePath="WageTypeCode"/> 
       <ComboBox x:Name="ddlJobTitles" VerticalAlignment="Top" Grid.Column="2" Grid.Row="2" 
          DisplayMemberPath="JobTitle" 
          SelectedValuePath="JobCode"/> 

       <StackPanel Grid.Column="2" Grid.Row="6" VerticalAlignment="Top" Orientation="Horizontal" Margin="5"> 
        <Button x:Name="btnOK" VerticalAlignment="Center" Content="OK" IsDefault="True" Margin="0" Click="btnOK_Click" Style="{StaticResource OKButtonStyle}"/> 
        <Button x:Name="btnCancel" VerticalAlignment="Center" Content="Cancel" IsCancel="True" Margin="10,0,0,0" Click="btnCancel_Click"/> 
       </StackPanel> 
      </Grid> 
     </Border> 
    </Grid> 
</UserControl> 
+0

你能否也向我們展示了OKButtonStyle的定義是什麼? – 2008-12-16 16:58:32

+0

Button.Style中的樣式需要一個TargetType。 – 2008-12-16 17:08:50

回答

9

這是怎麼

BasedOn="{StaticResouce DefaultButton}" 

應該指的是默認的按鈕樣式?由於DefaultButton是您應用中未定義的資源,因此崩潰。

它應該是:

BasedOn="{StaticResource {x:Type Button}}" 

編輯:對不起,回答太匆匆。

我注意到現在你的按鈕有一個Style = {}集合,並且指向一個叫做OkBUttonStyle的樣式。這是應該定義所有內容並基於默認按鈕樣式的樣式。通過一切,我包括這些觸發器。你在XAML中說的是Style是你的Button的內容。

也許一些代碼將有助於:

<Window x:Class="WindowsApplication7.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="WindowsApplication7" Height="300" Width="300" 
    > 
    <Window.Resources> 
    <Style TargetType="{x:Type Button}" x:Key="defaultButtonStyle"> 
     <Setter Property="Background" Value="Red" /> 
    </Style> 

    <Style TargetType="{x:Type Button}" x:Key="okButtonStyle" BasedOn="{StaticResource defaultButtonStyle}"> 
     <Setter Property="Foreground" Value="Green" /> 
     <Style.Triggers> 
     <Trigger Property="IsEnabled" Value="True"> 
      <Setter Property="Background" Value="Yellow" /> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Foreground" Value="Blue" /> 
     </Trigger> 
     </Style.Triggers> 
    </Style> 
    </Window.Resources> 
    <StackPanel> 
    <Button>System default</Button> 
    <Button Style="{StaticResource defaultButtonStyle}">My Default</Button> 
    <Button Style="{StaticResource okButtonStyle}">Ok</Button> 
    <Button Style="{StaticResource okButtonStyle}" IsEnabled="False">Ok disabled</Button> 
    </StackPanel> 
</Window>