2016-08-26 1 views
0

XAMLでカスタムProgressBarコントロールがあり、ProgressBar値を書き込むために、その上にTextBoxを設定したいとします。しかし、私は正しく値をバインドすることはできません。ProgressBarの値をResourceDictionaryのテキストボックスにバインドする方法は?

コード部が固定される。

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

更新:style.xaml全体コード(のResourceDictionary)

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

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

任意の理由をテキストボックスの 'Text'プロパティをプログレスバーの' Value'プロパティに束縛しませんか? –

+0

これは 'XmlParseException'にこの行を追加します。通常はバインディングのためにElementNameを渡す必要がありますが、このコードは 'ResourceDictionary.Style'にあり、スタイルの' x:Name'または 'Name'プロパティは受け付けません。私はより明確に私の全体のコードで私の質問を更新します。 –

+0

どの行ですか?どのようなスタイル? –

答えて

1

EventTriggerを削除してみてください。この:

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

あなたがBinding代わりに使用する必要があります。その場合にはValue、フォーマットする必要がありますすることができます

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

それは動作します。ありがとうございました。 –

関連する問題