2010-09-16 84 views
0

我已經創建了一個UserControl來製作一個ImageButton。但我用Button替換了UserControl Item。Wpf CustomButton工具欄風格

<Button x:Class="myimagebutton" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:imagebutton"> 

    <Grid x:Name="grdButton"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 

     <Image Grid.Column="0" 
       x:Name="btnImage" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Center"> 
     </Image> 
     <TextBlock Grid.Column="1" 
        TextWrapping="Wrap" 
        Text="{Binding Text}" 
        VerticalAlignment="Center" 
        Margin="2 0 2 0" /> 
    </Grid> 
</Button> 

現在我想將工具欄按鈕樣式應用於我的按鈕,如果此按鈕位於工具欄中。我已閱讀這篇文章link text並把這個

If Me.Style Is Nothing AndAlso TypeOf Me.Parent Is ToolBar Then 
    Me.Style = DirectCast(FindResource(ToolBar.ButtonStyleKey), Style) 
End If 

在我的Codebehind。

之後,我把我的按鈕放在一個工具欄,另一個出來的工具欄來測試它。但按鈕總是獲得默認樣式。調試後,我發現Me.Parent總是沒有。所以現在是我的問題如何獲取我的按鈕在工具欄中的信息?

回答

0

我在理解你所描述的內容時有些困難,但在閱讀了幾遍之後,我想我明白了。

我到目前爲止是否正確?

如果是的話,你想知道爲什麼你的按鈕具有圖像

關於你的描述是扔我和可能是爲什麼你還沒有見過任何人發帖回答你的問題的原因有幾點建議迄今。

我更換了用戶控件項目的一個按鈕

基本上你做了什麼是創造了新的控制是有可能從按鈕繼承。您可能已經開始使用UserControl,但爲了替換XAML中的根項目,您還必須確保類型myimagebutton繼承自Button。這就是XAML的工作原理,學習如何以這種方式解釋它可以幫助人們理解你在做什麼。

通常從Button繼承並不是開發人員重寫WPF中按鈕的視覺樣式主要是因爲WPF不支持有時稱爲visual inheritance的概念,還有其他合適的方法可用於以不同的方式解決問題。相反,繼承主要用於在需要對現有控件類進行行爲修改或添加時。據說有些方法通過使用類似於ASP.NET中的內容頁面和母版頁的內容控件來模擬可視化繼承,但我認爲這有點超出了示例的範圍。同樣,如果你要追求繼承模型,你需要確保在你的代碼中,你在靜態構造函數中設置了正確的默認樣式,所以將代碼放在你的按鈕後面也會有幫助。

我相信你的例子不工作的原因是因爲ToolBar專門查看控件的類型而不考慮繼承以便應用它的自定義工具欄樣式。在你的情況下,你的控件的類型是myimagebutton,而不是Button,所以樣式不是由ToolBar設置的,它通常根據使用兩種潛在類型的調用的控件的類型直接設置Style屬性。

element.SetResourceReference(FrameworkElement.StyleProperty, styleKey); 
element.DefaultStyleKey = styleKey; 

順便說一句,你的情況我相信,只有第二行是由工具欄控制和styleKey在這一點上進行定義爲空。

現在,您不必先從Button繼承,而是爲您的按鈕創建新的ControlTemplate或DataTemplate,並分別通過使用樣式分配到Template或ContentTemplate屬性中。這樣你仍然總是處理一個按鈕,風格是改變視覺屬性的東西。

<Window x:Class="HeaderedContentControlTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" 
     Height="252" 
     Width="372"> 
    <Window.Resources> 
     <Style TargetType="{x:Type Label}"> 
      <Setter Property="Background" 
        Value="Orange" /> 
     </Style> 

     <DataTemplate x:Key="ImageButtonDataTemplate"> 
      <Grid x:Name="grdButton"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition /> 
        <ColumnDefinition /> 
       </Grid.ColumnDefinitions> 

       <Image Grid.Column="0" 
         HorizontalAlignment="Left" 
         VerticalAlignment="Center"> 
       </Image> 
       <TextBlock Grid.Column="1" 
          TextWrapping="Wrap" 
          Text="{Binding}" 
          VerticalAlignment="Center" 
          Margin="2 0 2 0" 
          Background="Pink" /> 
      </Grid> 
     </DataTemplate> 

     <Style x:Key="ImageButtonStyle" 
       TargetType="{x:Type Button}"> 
      <Setter Property="ContentTemplate" 
        Value="{StaticResource ImageButtonDataTemplate}" /> 
     </Style> 

    </Window.Resources> 
    <Grid Margin="11"> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 

     <ToolBar> 
      <Button Style="{StaticResource ImageButtonStyle}" 
        Content="Some Text" /> 
     </ToolBar> 

     <Button Grid.Row="1" 
       Style="{StaticResource ImageButtonStyle}" 
       VerticalAlignment="Center" 
       HorizontalAlignment="Center" 
       Content="Some Text" /> 
    </Grid> 
</Window> 

使用的ContentTemplate允許您重新定義按鈕內的內容不會丟失所有的特殊按鈕狀態轉換和其他細微你通常想保留的。

請參閱MSDN論壇上的this related post論壇也解釋了將一個包含按鈕的StackPanel添加到ToolBar時的類似行爲。