Как связаны кнопки WPF и стили TextBlock? - PullRequest
1 голос
/ 19 декабря 2010

У меня есть собственный стиль для моих кнопок по умолчанию, а также я создал собственный стиль для TextBlocks.Если я полностью удаляю стиль TextBlock, все работает нормально, но после добавления стиля TextBlock по какой-то причине стиль Button используется в текстовом состоянии Button по умолчанию.Кажется, что здесь происходит какое-то наследование, но я не вижу, где в документах msdn.Что происходит?

Я использую Expression Blend 4 - и еще одна странность заключается в том, что предварительный просмотр в Blend выглядит нормально, но когда я запускаю приложение, стили кнопок неправильны в ихсостояние по умолчанию. Вот стили, которые кажутся противоречивыми:

        <ResourceDictionary>

        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <Trigger Property="IsMouseOver"
                         Value="True">
                    <Setter Property="Foreground">
                        <Setter.Value>
                            <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                                <GradientStop Color="White" Offset="0"/>
                                <GradientStop Color="#FFFDFF00" Offset="1"/>
                            </LinearGradientBrush>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
                    <Setter Property="RenderTransform">
                        <Setter.Value>
                            <TransformGroup>
                                <ScaleTransform ScaleY="1.20" ScaleX="1.20"/>
                                <SkewTransform/>
                                <RotateTransform/>
                                <TranslateTransform/>
                            </TransformGroup>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Grid>
                            <ContentPresenter RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
                                <ContentPresenter.Effect>
                                    <DropShadowEffect BlurRadius="3" ShadowDepth="4"/>
                                </ContentPresenter.Effect>
                            </ContentPresenter>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsFocused" Value="True"/>
                            <Trigger Property="IsDefaulted" Value="True"/>
                            <Trigger Property="IsMouseOver" Value="True"/>
                            <Trigger Property="IsPressed" Value="True"/>
                            <Trigger Property="IsEnabled" Value="False"/>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="FontFamily" Value="/Rtk;component/Fonts/#Segoe Print"/>
            <Setter Property="FontWeight" Value="Bold"/>
            <Setter Property="FontSize" Value="18"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="HorizontalAlignment" Value="Center"/>
            <Setter Property="VerticalAlignment" Value="Center"/>
            <Setter Property="Background" Value="{x:Null}"/>
        </Style>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="TextWrapping" Value="NoWrap"/>
            <Setter Property="TextTrimming" Value="None"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="FontSize" Value="16"/>
            <Setter Property="Effect">
                <Setter.Value>
                    <DropShadowEffect BlurRadius="3" ShadowDepth="4"/>
                </Setter.Value>
            </Setter>
            <Setter Property="FontFamily" Value="/Rtk;component/Fonts/#Segoe Print"/>
        </Style>
    </ResourceDictionary>

Вот как я использую сам элемент управления Button:

<Button Content="Button Text" FontSize="24"/>  

(обратите внимание, что этот размер шрифтаотличается от размера, указанного в стиле по умолчанию, 18 - я хочу переопределить его в случае этой кнопки)

Редактировать: Фактическая запись кнопки выглядит так в MainWindow.xaml, естьникаких других настроек, кроме изменений стиля, которые я представил в App.xaml:

<Button Content="Button" HorizontalAlignment="Left" Margin="336,0,0,274.226" VerticalAlignment="Bottom" Width="75"/>

Чтобы проиллюстрировать то, что я вижу: alt text

alt text

Ответы [ 3 ]

4 голосов
/ 19 декабря 2010

Просто быстрое предположение, но когда содержимое кнопки является строкой, не является ли это текстовым блоком по умолчанию?

2 голосов
/ 20 декабря 2010

Как и предполагали люди, ваша кнопка содержит текстовый блок, созданный для хранения контента, она выбирает стиль из app.xaml, вы можете обойти это несколькими способами, вот пара:

Поместите явный текстовый блок в вашу кнопку и не применяйте стиль:

  <Button Margin="272,192,277,0" VerticalAlignment="Top">
        <TextBlock Text="Button" Style="{x:Null}"/>
    </Button>

Поместите текстовый блок в свой стиль кнопки, также с нулевым стилем:

 <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate TargetType="{x:Type Button}">
                <Grid>
      <TextBlock Text="{TemplateBinding Content}" Style="{x:Null}">
                       <TextBlock.Effect>
                          <DropShadowEffect BlurRadius="3" ShadowDepth="4"/>
                       </TextBlock.Effect>
      </TextBlock>
         </Grid>
              <ControlTemplate.Triggers>
                  <Trigger Property="IsFocused" Value="True"/>
                  <Trigger Property="IsDefaulted" Value="True"/>
                  <Trigger Property="IsMouseOver" Value="True"/>
                  <Trigger Property="IsPressed" Value="True"/>
                  <Trigger Property="IsEnabled" Value="False"/>
                </ControlTemplate.Triggers>
              </ControlTemplate>
            </Setter.Value>

Надеюсь, один из тех2 будет работать на вас.

1 голос
/ 19 декабря 2010

Глядя только на ваш код, я не вижу, как стиль TextBlock каким-либо образом повлияет на внешний вид кнопок - , если Содержимое кнопок не состоит (прямо или косвенно) изTextBlocks.Можете ли вы опубликовать более полный пример кода, возможно, включая XAML для кнопки?

...