2012-06-16 8 views
6

पहली शैली के लिए xaml जैसा मैं चाहता हूं, विंगडिंग ग्लाइफ के साथ एक बटन का उत्पादन सामग्री और उसके गुणों को निर्धारित करने के लिए सेटर्स का उपयोग करके एक बटन का उत्पादन करना। इस शैली का दूसरा संस्करण एक ही चीज़ करने की कोशिश कर रहा है लेकिन सामग्री के लिए डेटा टेम्पलेट के साथ, लेकिन यह केवल डेटा टेम्पलेट (यानी, System.Windows.DataTemplate) के प्रकार को प्रदर्शित करता है।सेटर्स के माध्यम से स्टाइल सामग्री v ContentTemplate

  1. दूसरा संस्करण समान सामग्री को पहले के रूप में क्यों प्रदर्शित नहीं करेगा?
  2. फिक्स मानना ​​मामूली है, क्या शैली का एक संस्करण व्यक्तिगत वरीयता से परे किसी भी कारण से दूसरे पर बेहतर होगा?

नोट: मैं बाइंडिंग दिखा रहा हूँ और मामले में चलाता है वहाँ उस सामग्री को प्रभावित कर रहा है में कुछ है, लेकिन यह केवल एक शैली है जिसे

चीयर्स भिन्न होता है,
Berryl

के पहले भाग है

शैली 1

प्रदर्शित करता है: enter image description here

<Style x:Key="EditCommandButtonStyle" TargetType="{x:Type Button}" > 
    <Setter Property="Content" Value="a" /> 
    <Setter Property="Foreground" Value="Navy" /> 
    <Setter Property="FontFamily" Value="Wingdings 3" /> 
    <Setter Property="FontWeight" Value="Bold" /> 
    <Setter Property="FontSize" Value="18" /> 
    <Setter Property="Width" Value="30" /> 
    <Setter Property="Height" Value="Auto" /> 

    <!--What makes it an Edit button--> 
    <Setter Property="Command" Value="{Binding ActivateThisSatelliteVmCommand}"/> 
    <Setter Property="ToolTip"> 
     <Setter.Value> 
      <TextBlock> 
       <TextBlock.Text> 
        <Binding Path="HeaderLabel" StringFormat="{resx:Resx ResxName=Smack.Core.Presentation.Resources.MasterDetail, Key=Item_Edit_Label}"/> 
       </TextBlock.Text> 
      </TextBlock> 
     </Setter.Value> 
    </Setter> 

    <!-- WHen its available --> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border x:Name="theBorder" CornerRadius="4"> 
        <ContentPresenter x:Name="theContent" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="False"> 
         <Setter TargetName="theContent" Property="Visibility" Value="Hidden"/> 
         <Setter TargetName="theBorder" Property="Background" Value="Transparent"/> 
        </Trigger> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter TargetName="theContent" Property="Visibility" Value="Visible"/> 
        </Trigger> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter TargetName="theContent" Property="Visibility" Value="Visible"/> 
         <Setter TargetName="theBorder" Property="Background" Value="Orange"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

शैली 2

प्रदर्शित करता है "System.Windows.DataTemplate"

<Style x:Key="EditCommandButtonStyle" TargetType="{x:Type Button}" > 
    <Setter Property="Content"> 
     <Setter.Value> 
      <DataTemplate> 
       <TextBlock Text="a" FontFamily="Wingdings 3" FontWeight="Bold" FontSize="18" Foreground="Navy" /> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 

    <!--What makes it an Edit button--> 
    <Setter Property="Command" Value="{Binding ActivateThisSatelliteVmCommand}"/> 
    <Setter Property="ToolTip"> 
     <Setter.Value> 
      <TextBlock> 
       <TextBlock.Text> 
        <Binding Path="HeaderLabel" StringFormat="{resx:Resx ResxName=Core.Presentation.Resources.MasterDetail, Key=Item_Edit_Label}"/> 
       </TextBlock.Text> 
      </TextBlock> 
     </Setter.Value> 
    </Setter> 

    <!-- When its available --> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border x:Name="theBorder" CornerRadius="4"> 
        <ContentPresenter x:Name="theContent" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="False"> 
         <Setter TargetName="theContent" Property="Visibility" Value="Hidden"/> 
         <Setter TargetName="theBorder" Property="Background" Value="Transparent"/> 
        </Trigger> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter TargetName="theContent" Property="Visibility" Value="Visible"/> 
        </Trigger> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter TargetName="theContent" Property="Visibility" Value="Visible"/> 
         <Setter TargetName="theBorder" Property="Background" Value="Orange"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

समस्या निवारण टेक्स्टब्लॉक से रैपिंग डेटा टेम्पलेट को हटा रहा है? – LPL

+0

@ एलपीएल। नहीं, DataTemplate के बिना इसे रनटाइम त्रुटि लपेटें: त्रुटि 'System.Windows.Controls.TextBlock' एक सिस्टम पर 'System.Windows.Controls.ContentControl.ContentTemplate' प्रॉपर्टी के लिए मान्य मान नहीं है। – Berryl

+0

डेटा टेम्पलेट को हटाने के लिए मेरे लिए काम करता है। आपको अपनी सामग्री को सामग्री की संपत्ति में रखना चाहिए। कोई टेम्पलेट आवश्यक है। – Phil

उत्तर

14

आपका Content संपत्ति एक DataTemplate

DataTemplates पर सेट है Template गुणों के साथ इस्तेमाल किया जा के लिए होती हैं, और सीधे में सम्मिलित नहीं किया Content संपत्ति

सेट करने के लिए अपना स्टाइल सेटर बदलें Content के बजायऔर यह ठीक

<Setter Property="ContentTemplate"> 
    <Setter.Value> 
     <DataTemplate> 
      <TextBlock Text="a" FontFamily="Wingdings 3" FontWeight="Bold" FontSize="18" Foreground="Navy" /> 
     </DataTemplate> 
    </Setter.Value> 
</Setter> 

अपने दूसरे प्रश्न का सवाल है काम करना चाहिए, मैं पहली बार पसंद करते हैं क्योंकि इसके आसान, और मुझे लगता है कि यह दृश्य ट्री में कम तत्व शामिल हो सकते (मैं डबल होगा जांचें)

+6

बिंगो, आश्चर्यजनक रूप से। यह मेरे संदेह की पुष्टि करता है कि डब्ल्यूपीएफ सीखने की वक्र आश्चर्यजनक रूप से खड़ी है जब केवल एक छोटे से मुट्ठी भर लोग हैं जो लगातार जवाब देने के जवाब हैं। चियर्स – Berryl

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