2009-06-10 21 views
6

पर कस्टम निर्भरता संपत्ति बाध्यकारी विरासत विस्तारक को डिज़ाइन करते समय मुझे कोई समस्या है। मेरा इरादा डिफ़ॉल्ट विस्तारक शीर्षलेख में टॉगल बटन और टेक्स्ट के पीछे प्रगति पट्टी रखना है।कस्टम WPF शैली

मेरे पास यह एक्सएएमएल कोड है जो मुझे हेडर में प्रगति पट्टी देता है। यह एक कस्टम शैली है।

<Style x:Key="CurrentScanExpanderStyle" TargetType="{x:Type local:ProgressExpander}"> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
     <Setter Property="Background" Value="Transparent"/> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
     <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
     <Setter Property="BorderBrush" Value="Transparent"/> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:ProgressExpander}"> 
        <Border SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3"> 
         <DockPanel> 
          <Grid DockPanel.Dock="Top"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="*"/> 
           </Grid.ColumnDefinitions> 
           <ProgressBar Name="ProgressBar"/> 
           <ToggleButton FontFamily="{TemplateBinding FontFamily}" FontSize="{TemplateBinding FontSize}" FontStretch="{TemplateBinding FontStretch}" FontStyle="{TemplateBinding FontStyle}" FontWeight="{TemplateBinding FontWeight}" Foreground="{TemplateBinding Foreground}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" FocusVisualStyle="{StaticResource ExpanderHeaderFocusVisual}" Margin="1" MinHeight="0" MinWidth="0" x:Name="HeaderSite" Style="{StaticResource ExpanderDownHeaderStyle}" IsChecked="{Binding Path=IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Content="{TemplateBinding Header}" ContentTemplate="{TemplateBinding HeaderTemplate}" ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}"/> 
          </Grid> 
          <ContentPresenter Focusable="false" Visibility="Collapsed" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" x:Name="ExpandSite" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" DockPanel.Dock="Bottom"/> 
         </DockPanel> 
        </Border> 
        <ControlTemplate.Triggers> 
         <!-- Triggers haven't changed from the default --> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

यह ठीक काम करता है लेकिन मुझे अपनी कस्टम निर्भरता संपत्ति को बाध्य करने में समस्या हो रही है जो प्रगति प्रतिशत को नियंत्रित करता है।

  <local:ProgressExpander Grid.Row="1" Header="Current Scan" ExpandDirection="Down" x:Name="currentScanExpander" Style="{DynamicResource CurrentScanExpanderStyle}"> 
       <Canvas Background="SkyBlue" 
         Name="currentScanCanvas" 
         Height="{Binding ElementName=currentScanExpander, Path=ActualWidth}" 
         /> 
      </local:ProgressExpander> 

मुझे यकीन है कि कैसे शैली के भीतर ProgressBar में प्रगति मूल्य को यह निर्भरता संपत्ति प्रगति बाध्य करने के लिए नहीं कर रहा हूँ:

public class ProgressExpander : Expander 
{ 
    static ProgressExpander() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(ProgressExpander), new FrameworkPropertyMetadata(typeof(ProgressExpander))); 
    }  



    public int Progress 
    { 
     get { return (int)GetValue(ProgressProperty); } 
     set { SetValue(ProgressProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Progress. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ProgressProperty = 
     DependencyProperty.Register("Progress", typeof(int), typeof(ProgressExpander), new UIPropertyMetadata(0)); 


} 

इस विंडो के अंदर कोड है।

किसी भी मदद की सराहना की जाएगी।

उत्तर

12

शैली में, हम संपत्ति स्थापित करने के लिए एक सापेक्ष स्रोत के साथ मानक बाध्यकारी का उपयोग कर सकते हैं।

<ProgressBar Name="ProgressBar" 
      Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Progress}" 
      Minimum="0" 
      Maximum="100" /> 

फिर, खिड़की में हम सिर्फ प्रगति = "50" जोड़ सकते हैं या कहीं और करने के लिए एक बाध्यकारी।

आपको इसे देखने के लिए बटन की पृष्ठभूमि पारदर्शी या लेआउट के किसी भी तरीके को बदलने की आवश्यकता होगी।

+1

शायद इसके बजाय टेम्पलेट बाइंडिंग का उपयोग कर सकता है; कम टाइपिंग, प्लस यही है कि टेम्पलेट बाइंडिंग के लिए है। http://msdn.microsoft.com/en-us/library/ms742882.aspx –

+0

कोड के साथ कुछ गड़बड़ है जैसा कि इसे टेम्पलेटबिंडिंग का उपयोग करने से रोक रहा है, यही कारण है कि मैंने इसे मजबूत बाध्यकारी का उपयोग करके सेट अप किया है। – rmoore

+0

यह एक इलाज किया! Iwas टेम्पलेटबिंडिंग के साथ समस्याओं का एक गुच्छा है ... विरासत की बात होनी चाहिए। धन्यवाद एक बंडल। = D –

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