2016-08-26 5 views
0

Ich habe ein benutzerdefiniertes ProgressBar-Steuerelement in XAML und ich möchte eine TextBox darüber setzen, um den ProgressBar-Wert zu schreiben. Aber ich kann den Wert nicht korrekt binden.Wie binden Sie den ProgressBar-Wert an Textfeld in ResourceDictionary?

Codeteil festgelegt werden:

<ControlTemplate.Triggers> 
<EventTrigger RoutedEvent="ValueChanged"> 
    <BeginStoryboard> 
     <Storyboard> 
      <ObjectAnimationUsingKeyFrames BeginTime="0:0:0" Storyboard.TargetName="txt" 
                   Storyboard.TargetProperty="Text"> 
       <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{Binding Path=Value,RelativeSource={RelativeSource TemplatedParent}, StringFormat={}{0:0}%}"/> 
      </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
    </BeginStoryboard> 
</EventTrigger> 
</ControlTemplate.Triggers> 

aktualisiert: gesamte Code in style.xaml (Resource)

<Style x:Key="colorizedPB" TargetType="ProgressBar"> 
<Setter Property="Background" Value="Red"/> 
<Setter Property="BorderBrush" Value="LightGray"/> 
<Setter Property="BorderThickness" Value="1"/> 
<Setter Property="Foreground" Value="Black"/> 
<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="ProgressBar"> 
      <Viewbox> 
       <Border HorizontalAlignment="Left" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" 
          BorderBrush="Gray" BorderThickness="1"> 
        <Grid> 
         <Rectangle x:Name="rect" HorizontalAlignment="Left" Fill="{TemplateBinding Background}" Width="0" Height="{TemplateBinding Height}"> 
          <Rectangle.RenderTransform> 
           <TranslateTransform X="0" Y="0"/> 
          </Rectangle.RenderTransform> 
         </Rectangle> 
         <TextBlock x:Name="txt" FontSize="13" Foreground="{TemplateBinding Foreground}" HorizontalAlignment="Center" VerticalAlignment="Center" Text="test"/> 
        </Grid> 
       </Border> 
      </Viewbox> 
      <ControlTemplate.Triggers> 
       <EventTrigger RoutedEvent="ValueChanged"> 
        <BeginStoryboard> 
         <Storyboard> 
          <ObjectAnimationUsingKeyFrames BeginTime="0:0:0" Storyboard.TargetName="txt" 
                   Storyboard.TargetProperty="Text"> 
           <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ProgressBar}}, Path=Value, Mode=OneWay}"/> 
          </ObjectAnimationUsingKeyFrames> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

In MainWindow.xaml

<Grid Grid.Column="1" Margin="8,102,10,53"> 
      <ProgressBar Background="LightBlue" Name="progressBar" Style="{DynamicResource colorizedPB}" Width="200" Height="20"/> 
     </Grid> 
+0

Gibt es Gründe, können Sie binden Sie die 'Text' -Eigenschaft des Textfelds nicht an die' Value' -Eigenschaft des Fortschrittsbalkens? –

+0

Es gibt 'XmlParseException' für diese Zeile. Normalerweise muss ich einen ElementName für die Bindung angeben, aber diesen Code in 'ResourceDictionary.Style' und er akzeptiert nicht die' x: Name' oder 'Name' Eigenschaften für die Stile. Ich werde meine Frage mit meinem ganzen Code aktualisieren, um klarer zu sein. –

+0

Welche Linie? Welche Stile? –

Antwort

1

die Eventtrigger löschen und versuchen Sie dies:

<TextBlock 
    x:Name="txt" 
    FontSize="13" 
    Foreground="{TemplateBinding Foreground}" 
    HorizontalAlignment="Center" 
    VerticalAlignment="Center" 
    Text="{TemplateBinding Value}" 
    /> 

Sie möchten Value zu formatieren, in dem Fall, dass Sie einen Binding stattdessen verwenden benötigen:

<TextBlock 
    x:Name="txt" 
    FontSize="13" 
    Foreground="{TemplateBinding Foreground}" 
    HorizontalAlignment="Center" 
    VerticalAlignment="Center" 
    Text="{Binding Value, RelativeSource={RelativeSource TemplatedParent}, StringFormat={}{0:0.00}}" 
    /> 
+0

Es funktioniert. Danke @Ed. –

Verwandte Themen