2009-06-10 10 views
6

Ich habe ein Problem beim Entwerfen eines geerbten Expanders. Mein Ziel ist es, einen Fortschrittsbalken hinter der Umschaltfläche und dem Text im Standard-Expander-Header zu haben.Benutzerdefinierte Abhängigkeitseigenschaft mit benutzerdefiniertem WPF-Stil verknüpfen

Ich habe diesen XAML-Code, der mir den Fortschrittsbalken in der Kopfzeile gibt. Es ist ein benutzerdefinierter Stil.

<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> 

dies funktioniert gut, aber Ich habe Probleme, meine benutzerdefinierte Abhängigkeitseigenschaft binden, die den Prozentsatz steuert.

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)); 


} 

Dies ist der Code innerhalb des Fensters:

  <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> 

Ich bin nicht sicher, wie diese Abhängigkeitseigenschaft Fortschritte bei dem ProgressBar im Stil an den Fortschrittswert zu binden.

Jede Hilfe wäre willkommen.

Antwort

12

Im Stil können wir eine Standardbindung mit einer RelativeSource verwenden, um die Eigenschaft einzurichten.

Dann, im Fenster fügen wir einfach Progress = "50" oder eine Bindung an woanders.

Sie müssen auch den Hintergrund der Schaltfläche transparent einstellen oder eine andere Art des Layouts ändern, um es zu sehen.

+1

Konnte wahrscheinlich eine TemplateBinding stattdessen verwenden; weniger tippen, und dafür ist TemplateBinding zuständig. http://msdn.microsoft.com/en-us/library/ms742882.aspx –

+0

Es ist etwas falsch mit dem Code als/ist, die verhindert, dass es TemplateBindings verwenden, weshalb ich es mit der stärkeren Bindung einrichten. – rmoore

+0

Das hat Spaß gemacht! Ich hatte ein paar Probleme mit den Templatebindungen ... muss eine Erbschaft sein. Dank ein Bündel. = D –

Verwandte Themen