2017-08-10 39 views
0

问题: 我想在XAML中创建一个按钮模板,其中我将图像源绑定到内容展示器内容框或类似的东西。Binding ImageSource DesignTime

的解决方案所需的参数: 我明白,一个标准的按键我能一个StackPanel或网格添加到该按钮,将图片插入所述容器和收工。不过,我并不喜欢Windows'chrome'外观,也不是蓝色鼠标,单击和聚焦效果。我试图做的是创建一个新的按钮模板(编辑默认按钮模板的副本,并删除铬容器),有能力成为一个基本模板,随着我添加更多按钮,可以选择更改图像。

事情我已经试过及其结果:

<Button x:Name="btn"> 
    <StackPanel> 
     <Image source="imgsource.png"/> 
    </StackPanel> 
</Button> 

结果:有按钮镀铬效果。如果没有其他可能,可以回落,但我不喜欢它。

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
      <Border x:Name="bContainer" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" Height="{TemplateBinding Height}" VerticalAlignment="{TemplateBinding VerticalAlignment}" Width="{TemplateBinding Width}"> 
       <Grid x:Name="gBody" Background="#FF3C3C3C"/> 
      </Border> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsKeyboardFocused" Value="true"/> 
       <Trigger Property="ToggleButton.IsChecked" Value="true"/> 
       <Trigger Property="IsEnabled" Value="false"> 
        <Setter Property="Foreground" Value="#ADADAD"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter>  

<Button Style="{DynamicResource ButtonStyle}"> 
    <Grid> 
     <Image Source="imgsource.png"/> 
    </Grid> 
</Button> 

结果:图像不显示。我认为这是由于按钮自定义模板,但我的知识是有限的,所以我还没有深入研究。

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
      <Border x:Name="bContainer" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" Height="{TemplateBinding Height}" VerticalAlignment="{TemplateBinding VerticalAlignment}" Width="{TemplateBinding Width}"> 
       <Image x:Name="iImage" Source="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}" HorizontalAlignment="Left" Height="16" VerticalAlignment="Top" Width="16"/> 
      </Border> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsKeyboardFocused" Value="true"/> 
       <Trigger Property="ToggleButton.IsChecked" Value="true"/> 
       <Trigger Property="IsEnabled" Value="false"> 
        <Setter Property="Foreground" Value="#ADADAD"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter>  

<Button Style="{DynamicResource ButtonStyle}"> 
    <Grid> 
     <Image Source="imgsource.png"/> 
    </Grid> 
</Button> 

结果:进入到图像的完整路径时,图像仅显示了。我不确定我是否正确,但是在部署该程序时会不会造成问题?

+0

把网格与'之间的图像'要求设置按钮的内容属性。为了可视化内容,ControlTemplate应该包含一个ContentPresenter。 – Clemens

+0

谢谢,Clemens!杰森在下面说了同样的想法。对于我在下面发布的解决方案,我还有一个额外的问题。 –

回答

0

我有点惊讶你的第三个例子作品 - 即使是完整的路径。只是一目了然,它似乎不应该工作。你的第二次尝试是接近的,但你没有一个网站来绑定按钮的内容。

看看你的按钮:

<Button Style="{DynamicResource ButtonStyle}"> 
    <Grid> 
     <Image Source="imgsource.png"/> 
    </Grid> 
</Button> 

GridContent(网格是没有必要的 - 你可以把Image那里)。看着你的模板,你可以看到里面没有东西可以拿起内容。尝试添加内容展示到您的模板:

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
      <Border x:Name="bContainer" 
        BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}" 
        HorizontalAlignment="{TemplateBinding HorizontalAlignment}" 
        Height="{TemplateBinding Height}" 
        VerticalAlignment="{TemplateBinding VerticalAlignment}" 
        Width="{TemplateBinding Width}"> 
       <ContentPresenter x:Name="contentPresenter" 
            Focusable="False" 
            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
            Margin="{TemplateBinding Padding}" 
            RecognizesAccessKey="True" 
            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
            VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> 
      </Border> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsKeyboardFocused" 
         Value="true"/> 
       <Trigger Property="ToggleButton.IsChecked" 
         Value="true"/> 
       <Trigger Property="IsEnabled" 
         Value="false"> 
        <Setter Property="Foreground" 
          Value="#ADADAD"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter>  
+0

杰森,你绝对正确,非常感谢你把它放在我能理解的方式。我相信你的答案是正确的,但是在使用你的解决方案时需要多一步。通过消除方程中的网格,我不再有能力改变背景颜色,这使我无法改变鼠标悬停状态和mousedown状态的背景颜色。在保持这种能力的同时,是否有办法遵循您的解决方案? **编辑:啊!你将边界留在那里,这解决了这个问题。错过了。这是正确的答案!** –

+0

您不必在模板中更改按钮内容的背景。事实上,这可能会落入“意外行为”类别 - 用户不喜欢意想不到的行为。您可以更改模板内的“边框”的背景。编辑 - 我看你已经发现了。 –