2017-08-10 38 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

您不必在模板中更改按鈕內容的背景。事實上,這可能會落入「意外行爲」類別 - 用戶不喜歡意想不到的行爲。您可以更改模板內的「邊框」的背景。編輯 - 我看你已經發現了。 –