Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按钮背景边距_C#_Wpf_Xaml_Wpf Controls - Fatal编程技术网

C# 按钮背景边距

C# 按钮背景边距,c#,wpf,xaml,wpf-controls,C#,Wpf,Xaml,Wpf Controls,我正在寻找一种方法,有一个专门的空白按钮背景图像。现在我有这样的事情: <Button Grid.Column="3" Margin="2,0"> <Button.Background> <ImageBrush Stretch="Fill" TileMode="None"> <ImageBrush.ImageSource>

我正在寻找一种方法,有一个专门的空白按钮背景图像。现在我有这样的事情:

<Button Grid.Column="3" Margin="2,0">
    <Button.Background>
        <ImageBrush Stretch="Fill" TileMode="None">
            <ImageBrush.ImageSource>
                <DrawingImage Drawing="{StaticResource MyImage}" />
            </ImageBrush.ImageSource>
        </ImageBrush>
    </Button.Background>
</Button>

这将用图像完全填充我的按钮。这是(我认为…)正确的行为。现在我想在背景图像周围留一小块空白。我没有找到这样做的方法,因为无论是图像笔刷还是绘图图像都没有提供这样的属性。我知道,我可以使用按钮内容生成一个提供边距的图像,但通过这种方法,当我将按钮放在滚动查看器控件中时,按钮图像表现出奇怪的行为(当我调整视图大小时,按钮会变大,但图像保持较小)。处理这个问题的最佳方法是什么

  • 更新*
根据下面的答案,定制风格似乎是最合适的。无论如何,也许我的问题不是按钮本身,而是按钮周围的scrollviewer。我附上了两张图片,第一张是scrollview,第二张没有。使用滚动查看器时,图像很小,不适合按钮,所以这可能是根本原因?任何建议:

没有Scrollviewer:


设置填充,边距用于设置控件外部的间距,其中as Padding用于在有界控件内部提供空间,您应该执行以下操作:

  • 您必须设置内容,而不是背景属性 按钮的属性
  • 使用图像控件代替图像笔刷 作为按钮内容

  • 在此处设置
    边距
    填充
    将不起作用。
    Margin
    应用于按钮周围,而不是按钮中,而
    Padding
    应用于内部
    ContentPresenter
    。换句话说,填充将围绕
    内容
    ,而不是围绕
    背景
    ,因为这不是内容的一部分

    您解决此问题的选择是:

    • 创建已包含边距的图形(重新缩放时,边距不会保持不变)

    • 将图像创建为
      按钮的内容
      ,然后
      填充
      将起作用(推荐)

      
      
    • 编辑默认控件模板和样式以更改应用背景的方式。这可能会很乏味,并且会影响其他视觉状态,而不仅仅是静态状态,因此如果选择这样做,请小心。下面是一个例子,说明它可能是什么样子

      <SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
      <SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/>
      <SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
      <SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
      <SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
      <SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
      <SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
      <SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
      <SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
      <Style x:Key="FocusVisual">
         <Setter Property="Control.Template">
            <Setter.Value>
               <ControlTemplate>
                  <Rectangle Margin="2" StrokeDashArray="1 2" SnapsToDevicePixels="true" StrokeThickness="1" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
               </ControlTemplate>
            </Setter.Value>
         </Setter>
      </Style>
      <Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
         <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
         <Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
         <Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
         <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
         <Setter Property="BorderThickness" Value="1"/>
         <Setter Property="HorizontalContentAlignment" Value="Center"/>
         <Setter Property="VerticalContentAlignment" Value="Center"/>
         <Setter Property="Padding" Value="1"/>
         <Setter Property="Template">
            <Setter.Value>
               <ControlTemplate TargetType="{x:Type Button}">
                  <Border x:Name="border" Padding="{TemplateBinding Padding}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" SnapsToDevicePixels="true">
                     <Border x:Name="innerBorder" Background="{TemplateBinding Background}">
                        <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                     </Border>
                  </Border>
                  <ControlTemplate.Triggers>
                     <Trigger Property="IsDefaulted" Value="true">
                        <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                     </Trigger>
                     <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="Background" TargetName="innerBorder" Value="{StaticResource Button.MouseOver.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
                     </Trigger>
                     <Trigger Property="IsPressed" Value="true">
                        <Setter Property="Background" TargetName="innerBorder" Value="{StaticResource Button.Pressed.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
                     </Trigger>
                     <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Background" TargetName="innerBorder" Value="{StaticResource Button.Disabled.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
                        <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
                     </Trigger>
                  </ControlTemplate.Triggers>
               </ControlTemplate>
            </Setter.Value>
         </Setter>
      </Style>
      
      
      
      如果您将这些样式放在范围内的资源字典中,您可以这样使用它

      <Button Grid.Column="3" Style="{StaticResource ButtonStyle}" Padding="20, 0">
         <Button.Background>
            <ImageBrush Stretch="Fill" TileMode="None">
               <ImageBrush.ImageSource>
                  <DrawingImage Drawing="{StaticResource MyImage}" />
               </ImageBrush.ImageSource>
            </ImageBrush>
         </Button.Background>
      </Button>
      
      
      
      当然,如果省略样式键,也可以根据需要将其设为隐式


    您似乎需要设置
    填充
    。我想我找到了scrollviewer问题的原因。缺少的属性“HorizontalContentAlignment”和“VerticalContentAlignment”为“Stretch”。有时候WPF让我很疯狂:-)
    <SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
    <SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/>
    <SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
    <SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
    <SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
    <SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
    <SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
    <SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
    <SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
    <Style x:Key="FocusVisual">
       <Setter Property="Control.Template">
          <Setter.Value>
             <ControlTemplate>
                <Rectangle Margin="2" StrokeDashArray="1 2" SnapsToDevicePixels="true" StrokeThickness="1" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
             </ControlTemplate>
          </Setter.Value>
       </Setter>
    </Style>
    <Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
       <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
       <Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
       <Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
       <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
       <Setter Property="BorderThickness" Value="1"/>
       <Setter Property="HorizontalContentAlignment" Value="Center"/>
       <Setter Property="VerticalContentAlignment" Value="Center"/>
       <Setter Property="Padding" Value="1"/>
       <Setter Property="Template">
          <Setter.Value>
             <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="border" Padding="{TemplateBinding Padding}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" SnapsToDevicePixels="true">
                   <Border x:Name="innerBorder" Background="{TemplateBinding Background}">
                      <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                   </Border>
                </Border>
                <ControlTemplate.Triggers>
                   <Trigger Property="IsDefaulted" Value="true">
                      <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                   </Trigger>
                   <Trigger Property="IsMouseOver" Value="true">
                      <Setter Property="Background" TargetName="innerBorder" Value="{StaticResource Button.MouseOver.Background}"/>
                      <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
                   </Trigger>
                   <Trigger Property="IsPressed" Value="true">
                      <Setter Property="Background" TargetName="innerBorder" Value="{StaticResource Button.Pressed.Background}"/>
                      <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
                   </Trigger>
                   <Trigger Property="IsEnabled" Value="false">
                      <Setter Property="Background" TargetName="innerBorder" Value="{StaticResource Button.Disabled.Background}"/>
                      <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
                      <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
                   </Trigger>
                </ControlTemplate.Triggers>
             </ControlTemplate>
          </Setter.Value>
       </Setter>
    </Style>
    
    <Button Grid.Column="3" Style="{StaticResource ButtonStyle}" Padding="20, 0">
       <Button.Background>
          <ImageBrush Stretch="Fill" TileMode="None">
             <ImageBrush.ImageSource>
                <DrawingImage Drawing="{StaticResource MyImage}" />
             </ImageBrush.ImageSource>
          </ImageBrush>
       </Button.Background>
    </Button>