2008-12-16 13 views
6

Tengo un botón que está mirando 2 cuadros combinados para asegurarse de que tienen un valor antes de habilitarlo. El problema es que la manera en que lo estoy haciendo es sobreescribir el estilo predeterminado declarado en mi proyecto de tema.Botón WPF IsEnabled Basado en ComboBox Selección Sobrescritura estilo predeterminado

<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> 

He intentado añadir BasedOn = "{} StaticResouce MyDefaultButtonStyleName" a la etiqueta de estilo pero explota en tiempo de ejecución.

El error es "El valor 'System.Windows.Style' no se puede asignar a la propiedad 'Estilo' del objeto 'System.Windows.Controls.Button'. Solo se puede basar en un estilo con tipo de destino que es tipo base ' IFrameworkInputElement '. Error en el objeto' System.Windows.Style 'en el archivo de marcado "

¿Hay algo que hacer en XAML sin sobrescribir el estilo predeterminado?

EDITAR: Ejemplo de código actualizado. Aparece un error en OKButtonStyle que dice "No se puede agregar elemento a la propiedad 'Recursos', porque la propiedad solo puede tener un elemento secundario si usa una etiqueta de colección explícita. Error en el objeto 'System.Windows.Style' en el archivo de marcado"

<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

Podría también nos muestran la definición de OKButtonStyle? –

+0

El estilo dentro de Button.Style necesita un TargetType. –

Respuesta

9

cómo es esto

BasedOn="{StaticResouce DefaultButton}" 

supone que se refieren al estilo de botón predeterminado? Esto se bloquea porque DefaultButton es un recurso indefinido en su aplicación.

que debe ser:

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

EDIT: Lo sentimos, contestado con demasiada precipitación.

Me di cuenta ahora que su botón tiene un estilo = {} conjunto, y está apuntando a un estilo llamado OkBUttonStyle. Este es el estilo que debería definir todo y basarse en el estilo de botón predeterminado. Por todo, incluyo esos factores desencadenantes. Lo que estás diciendo en XAML es que el Estilo es el Contenido de tu Botón.

Tal vez algo de código ayudará:

<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> 
+0

BasedOn = "{StaticResouce DefaultButton}" es una instancia de estilo con nombre basada en x: Tipo Botón ex: .... – Nate

+0

perdón por eso, el OKButtonStyle fue otro camino que traté al tratar de resolver esto. Tomé el estilo desde dentro del botón, lo agregué a mis recursos y luego intenté basarlo en DefaultButton pero explotó con un error diferente. – Nate

Cuestiones relacionadas