Бутонът WPF е активиран въз основа на стила по подразбиране за избор на ComboBox

Имам бутон, който разглежда 2 комбинирани полета, за да се увери, че имат стойност, преди да бъде активиран. Проблемът е, че начинът, по който го правя, презаписва стила по подразбиране, деклариран в моя проект за тема.

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

Опитах се да добавя BasedOn="{StaticResouce MyDefaultButtonStyleName}" към етикета за стил, но той се раздува по време на изпълнение.

Грешката е „Стойността на „System.Windows.Style“ не може да бъде присвоена на свойството „Style“ на обект „System.Windows.Controls.Button“. Може да се базира само на стил с целеви тип, който е базов тип „IFrameworkInputElement“. Грешка в обект „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>

person Nate    schedule 16.12.2008    source източник
comment
Бихте ли ни показали и определението за OKButtonStyle?   -  person Szymon Rozga    schedule 16.12.2008
comment
Стилът вътре в Button.Style се нуждае от TargetType.   -  person Szymon Rozga    schedule 16.12.2008


Отговори (1)


Как е това

BasedOn="{StaticResouce DefaultButton}"

трябва да се отнася за стила на бутона по подразбиране? Това се срива, защото DefaultButton е недефиниран ресурс в приложението ви.

Трябва да бъде:

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

РЕДАКТИРАНЕ: Съжалявам, отговорих твърде прибързано.

Забелязах, че сега вашият бутон има набор Style={} и сочи към стил, наречен OkBUttonStyle. Това е стилът, който трябва да определя всичко и да се основава на стила на бутоните по подразбиране. Във всичко включвам тези тригери. Това, което казвате в XAML е, че стилът е съдържанието на вашия бутон.

Може би някакъв код ще помогне:

 <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>
person Szymon Rozga    schedule 16.12.2008
comment
BasedOn={StaticResouce DefaultButton} е наименуван екземпляр на стил, базиран на x:Type Button напр.: ‹Style x:Key=DefaultButton TargetType={x:Type Button}›....‹/Style› - person Nate; 16.12.2008
comment
съжалявам за този размер, OKButtonStyle беше друг път, по който минах, опитвайки се да разбера това. Взех стила от бутона, добавих го към ресурсите си и след това се опитах да го базирам на бутона по подразбиране, но това избухна с друга грешка. - person Nate; 16.12.2008