2011-11-22 56 views
1

我有以下WPF按鈕樣式:如何以編程方式訪問樣式中的元素?

<Style x:Key="myButtonStyle" TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Grid Width="{Binding Width}" Height="{Binding Height}"> 
        <Border Name="container" Background="{Binding Background}" CornerRadius="{Binding CornerRadius}"> 
         <TextBlock Margin="10" FontFamily="Arial" FontWeight="Bold" TextAlignment="Left" HorizontalAlignment="Left" VerticalAlignment="Top" Width="Auto" FontSize="{Binding TextSize}" Foreground="White" Text="{Binding Text}" TextWrapping="Wrap"/> 
        </Border> 
        <Border Name="overlay" Background="Transparent" CornerRadius="{Binding CornerRadius}" /> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter TargetName="overlay" Property="Opacity" Value="0.6" /> 
         <Setter TargetName="overlay" Property="Background" Value="Black" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

的問題是,雖然我的所有應用程序的按鈕具有相同的風格,他們中的一些需要周圍有邊框。因此,我想知道是否可以訪問我的風格的容器邊框來設置其厚度和顏色?如果是這樣,我該怎麼做?

編輯:

我混madd0和Josh的建議,並創建了一個DataTrigger我的風格,裏面搭配的結合,告訴我如果按鈕應該或不應該有邊框的屬性。

最終的代碼如下:

<Style x:Key="myButtonStyle" TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Grid Width="{Binding Width}" Height="{Binding Height}"> 
        <Border Name="container" Background="{Binding Background}" CornerRadius="{Binding CornerRadius}"> 
         <TextBlock Margin="10" FontFamily="Arial" FontWeight="Bold" TextAlignment="Left" HorizontalAlignment="Left" VerticalAlignment="Top" Width="Auto" FontSize="{Binding TextSize}" Foreground="White" Text="{Binding Text}" TextWrapping="Wrap"/> 
        </Border> 
        <Border Name="overlay" Background="Transparent" CornerRadius="{Binding CornerRadius}" /> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <DataTrigger Binding="{Binding Path=HasBorder}" Value="true"> 
         <Setter TargetName="container" Property="BorderThickness" Value="{Binding BorderThickness}" /> 
         <Setter TargetName="container" Property="BorderBrush" Value="{Binding BorderBrush}" /> 
        </DataTrigger> 

        <Trigger Property="IsPressed" Value="True"> 
         <Setter TargetName="overlay" Property="Opacity" Value="0.6" /> 
         <Setter TargetName="overlay" Property="Background" Value="Black" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

謝謝大家的幫助, Komyg

+3

它是什麼決定邊框是否應該出現?如果你使用觸發器做出這樣的改變,它會更乾淨 – madd0

回答

1

我認爲,如果你擴展Button類,並給它一個新的布爾的DependencyProperty,基本上所有你需要要做的是給你的邊界一個名字,然後在ControlTemplate.Triggers中,觸發該布爾屬性,使邊界,你需要它在你的特殊情況。

它與您已經擁有IsPressed ControlTemplate觸發器相似。

+0

嘿,謝謝你的回答。是否有可能使用數據綁定中的屬性來完成此操作?這樣,而不是實例化類,我只是在DataContext類中創建一個屬性。此屬性也有一個DependencyProperty? – Felipe

+0

是的,你應該能夠綁定到你的DataContext,通過使用RelativeSource或者託管你的按鈕的窗口或者用戶控件,然後在DataContext的前綴屬性,即。 DataContext.TheProperty。不,DataContext中的那個屬性不需要是一個依賴屬性,但如果該值發生變化,它將需要NotifyPropertyChanged。 – Josh

0

我不認爲你真的需要訪問你的控件模板屬性。由於Button已具有邊框屬性,因此您應該直接在按鈕上設置這些屬性。然後,將邊框添加到您的ControlTemplate,將其屬性綁定到按鈕的屬性。

相關問題