2013-07-16 8 views
23

मैं एक बटन रखना चाहता हूं जो CornerRadius और दो अन्य लोगों को परिभाषित करता है, मैं इसे कैसे प्राप्त कर सकता हूं?बटन टेम्पलेट पर कॉर्नर रेडियस सेट करें

<Style TargetType="Button" x:Key="TabButton"> 
    <Setter Property="Background" Value="White" /> 
    <Setter Property="TextBlock.TextAlignment" Value="Center" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Border CornerRadius="0" Background="White" BorderBrush="#ccc" BorderThickness="0,1,1,0" > 
        <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style TargetType="Button" x:Key="TabButtonFirst" BasedOn="{StaticResource TabButton}"> 
    <Setter Property="CornerRadius" Value="3,0,0,0" /> 
</Style> 

<Style TargetType="Button" x:Key="TabButtonLast" BasedOn="{StaticResource TabButton}"> 
    <Setter Property="CornerRadius" Value="0,0,0,3" /> 
</Style> 
+2

बटन CornerRadius संपत्ति नहीं है। अपने सीमा नियंत्रण के लिए इसे अपने कंट्रोल टेम्पलेट में सेट करें। – Nitesh

+4

आप जो कर रहे हैं उसे हासिल करने के लिए बटन के लिए दो शैलियों की आवश्यकता होगी या कॉर्नर रेडियस को निर्भरता प्रॉपर्टी के रूप में लागू करने के लिए कस्टम बटन बनाएं, और इसे नियंत्रण टेम्पलेट में सीमा के कॉर्नर रेडियस के साथ बाध्य करें। – Nitesh

उत्तर

26

के रूप में नितेश ने कहा है कि आप बटन पर एक CornerRadius संपत्ति नहीं है, यह सीमा की एक संपत्ति के रूप में आप अपने पहले शैली में दिखाया गया है, बस अपना पहला शैली नकल और CornerRadius बदलने के लिए, तो आवंटित यह उपयुक्त बटन की शैली के लिए।

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <Style TargetType="Button" x:Key="TabButton"> 
      <Setter Property="Background" Value="White" /> 
      <Setter Property="TextBlock.TextAlignment" Value="Center" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Border CornerRadius="0" Background="White" BorderBrush="#ccc" BorderThickness="0,1,1,0" > 
          <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     <Style TargetType="Button" x:Key="TabButtonFirst"> 
      <Setter Property="Background" Value="White" /> 
      <Setter Property="TextBlock.TextAlignment" Value="Center" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Border CornerRadius="3,0,0,0" Background="White" BorderBrush="#ccc" BorderThickness="0,1,1,0" > 
          <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     <Style TargetType="Button" x:Key="TabButtonLast"> 
      <Setter Property="Background" Value="White" /> 
      <Setter Property="TextBlock.TextAlignment" Value="Center" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Border CornerRadius="0,0,0,3" Background="White" BorderBrush="#ccc" BorderThickness="0,1,1,0" > 
          <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     </Window.Resources> 
     <Grid Background="Black"> 
     <Button Style="{StaticResource TabButton}" Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,72,0,0" Name="button1" VerticalAlignment="Top" Width="75" /> 
     <Button Style="{StaticResource TabButtonFirst}" Content="Button" Height="23" HorizontalAlignment="Left" Margin="10,43,0,0" Name="button2" VerticalAlignment="Top" Width="75" /> 
     <Button Style="{StaticResource TabButtonLast}" Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,101,0,0" Name="button3" VerticalAlignment="Top" Width="75" /> 
    </Grid> 
</Window> 

enter image description here

+0

कार्यात्मक रूप से ठीक काम करता है, लेकिन बटन अपनी डिफ़ॉल्ट स्टाइल खो देता है, यानी "ऑनमोउस ओवर", "ऑनमोउसक्लिक" ईवेंट बटन की दृश्य स्थिति नहीं बदलता है। – monstr

+1

जब भी मेरे पास केवल एक छोटे से छोटे बदलाव के साथ दो टेम्पलेट्स होते हैं तो मैं इसमें भाग लेता हूं। इस तरह के दोहराव कोड वास्तव में मुझे परेशान करता है। एक बेहतर तरीका होना चाहिए। – Jordan

+4

@ जोर्डन: मेरा जवाब देखें। :) –

19

आप नियंत्रण आप templating रहे हैं की निर्भरता गुण तक ही सीमित नहीं रहे हैं। इस मामले में, जबकि Button एक CornerRadius संपत्ति नहीं है, Border करता है, तो आप के बजाय Border.CornerRadius उपयोग कर सकते हैं: इस दृष्टिकोण के साथ

<Style TargetType="Button" x:Key="TabButton"> 
    <Setter Property="Background" Value="White" /> 
    <Setter Property="TextBlock.TextAlignment" Value="Center" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Border CornerRadius="{TemplateBinding Border.CornerRadius}" Background="White" BorderBrush="#ccc" BorderThickness="0,1,1,0" > 
        <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style TargetType="Button" x:Key="TabButtonFirst" BasedOn="{StaticResource TabButton}"> 
    <Setter Property="Border.CornerRadius" Value="3,0,0,0" /> 
</Style> 

<Style TargetType="Button" x:Key="TabButtonLast" BasedOn="{StaticResource TabButton}"> 
    <Setter Property="Border.CornerRadius" Value="0,0,0,3" /> 
</Style> 

, आप अब अपने नियंत्रण टेम्पलेट की कई प्रतियां बनाए रखने की जरूरत है।

+3

यह स्वीकार्य उत्तर –

+0

अद्भुत उत्तर होना चाहिए! – Midas

+0

मुझे पता है कि हमें +1 टिप्पणियां पसंद नहीं हैं, लेकिन यह वास्तविक जवाब है कि ज्यादातर लोगों को उन स्थितियों में तलाश करनी चाहिए जो उन्हें इस प्रश्न में ले जा रहे हैं। – MojoFilter

0

मैं अपना खुद का कस्टम बटन क्लास (बटन से विरासत में) बनाउंगा जिसमें कॉर्नर रेडियस निर्भरता संपत्ति शामिल है। और फिर आपकी शैली का लक्ष्य प्रकार इस नई कक्षा बन जाता है और आप कोने त्रिज्या को सेट करने के लिए टेम्पलेट बाइंडिंग का उपयोग कर सकते हैं।

इस दृष्टिकोण के साथ न केवल आपको अपने नियंत्रण टेम्पलेट की कई प्रतियों को बनाए रखने की आवश्यकता नहीं है, लेकिन हर बार जब आप अपने कोने त्रिज्या को संशोधित करना चाहते हैं तो आपको एक नई शैली बनाने की आवश्यकता नहीं है। आप सीधे अपने कॉर्नर रेडियस निर्भरता संपत्ति पर सेट या बाध्य कर सकते हैं।

public class MyCustomButton : Button 
{ 
    public static readonly DependencyProperty CornerRadiusProperty = 
     DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(MyCustomButton), new FrameworkPropertyMetadata(new CornerRadius(0))); 

    public CornerRadius CornerRadius 
    { 
     get { return (CornerRadius)GetValue(CornerRadiusProperty); } 
     set { SetValue(CornerRadiusProperty, value); } 
    } 
} 

और XAML:

तो नियंत्रण के लिए अपने कोड कुछ इस तरह दिख सकता है

<Style TargetType="MyCustomButton" x:Key="TabButton"> 
    <Setter Property="Background" Value="White" /> 
    <Setter Property="TextBlock.TextAlignment" Value="Center" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="MyCustomButton"> 
       <Border CornerRadius="{TemplateBinding CornerRadius}" Background="White" BorderBrush="#ccc" BorderThickness="0,1,1,0" > 
        <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
अपने बटन नहीं कोने की त्रिज्या की जरूरत है कि के लिए

तो, निर्भरता संपत्ति चूक के बाद से यह 0 तक, आपको कुछ भी करने की आवश्यकता नहीं है। जिनके पास कोने त्रिज्या है, आप केवल निर्भरता संपत्ति को उचित मूल्य पर सेट करते हैं क्योंकि आप सामान्य सीमा के लिए कॉर्नर रेडियस संपत्ति चाहते हैं।

8

बस इस तरह एक नया बटन बनाएं:

<!--Button--> 
      <Button 
       Name="myButton" 
       Content="OK" 
       FontFamily="Century Gothic" 
       Foreground="white" 
       Background="CornflowerBlue" 
       BorderThickness="0" 
       Padding="10" 
       Margin="10,5"> 

       <Button.Resources> 
        <Style TargetType="{x:Type Border}"> 
         <Setter Property="CornerRadius" Value="7"/> 
        </Style> 
       </Button.Resources> 

      </Button> 
+0

यह खुराक काम नहीं करता – chengzi

+0

अच्छा और सरल उत्तर, यदि आप एक बटन चाहते हैं तो अपनी खुद की संपत्तियां हों। –

संबंधित मुद्दे