2009-04-15 19 views
1

app.xamlにスタイルを定義しました。このスタイルには、オブジェクト(この場合はUserPin)にスタイルを適用する際に、私が制御したいいくつかのテキストTextBlocksが含まれています。 これらのTextBlocksランタイムにはどのようにアクセスできますか?私が設定しようとしているTextBlock値がtxtBottomあるSilverlight:スタイル内の要素にdatacontextを適用する

<Style x:Name="UserPin" TargetType="RRML_UserControls:UserPin" > 
    <Setter Property="RenderTransformOrigin" Value="0.5,0.5" /> 
    <Setter Property="AnchorPoint" Value="0.5,0.5" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="RRML_UserControls:UserPin"> 
       <Grid Height="71.969" Width="Auto"> 
        <Grid.RenderTransform> 
         <ScaleTransform x:Name="PART_PinScale" /> 
        </Grid.RenderTransform> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="29"/> 
         <RowDefinition Height="16"/> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="0.247*"/> 
         <ColumnDefinition Width="20"/> 
         <ColumnDefinition Width="0.753*"/> 
        </Grid.ColumnDefinitions> 
        <Image Height="Auto" Source="Resources/Users.png" x:Name="PART_imgUser" VerticalAlignment="Top" Stretch="Uniform" Margin="0,0,0,0" Grid.Column="1"> 
         <Image.RenderTransform> 
          <TransformGroup> 
           <ScaleTransform/> 
           <SkewTransform/> 
           <RotateTransform/> 
           <TranslateTransform/> 
          </TransformGroup> 
         </Image.RenderTransform> 
        </Image> 
        <TextBlock HorizontalAlignment="Center" Margin="0,0,0,0" Width="Auto" Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="1" TextWrapping="Wrap" VerticalAlignment="Center" TextAlignment="Center" x:Name="txtBottom" Text="{Binding Mode=OneWay, Path=LocationName}"> 
         <TextBlock.DataContext> 
          <RRML_RRMLServiceReference:Location LocationName="Initial Name"/> 
         </TextBlock.DataContext> 
        </TextBlock>        
        <TextBlock HorizontalAlignment="Right" Margin="0,0,0,0" VerticalAlignment="Center" Text="L" TextWrapping="Wrap"/> 
        <TextBlock Margin="0,0,0,0" Text="R" TextWrapping="Wrap" d:LayoutOverrides="Width, Height" Grid.Column="2" HorizontalAlignment="Left" VerticalAlignment="Center"/>        
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

:スタイルはこのようになります

Style = Application.Current.Resources["UserPin"] as Style; 

: 私は、スタイルを取得します。 ご覧のとおり、私はdatacontextとdatabindingをフィールドに適用しようとしました。これは動作しますが、すべてのオブジェクトは当然 "初期名"という値を取得します。

私の質問は以下のとおりです。

  1. は、どのように私は私のDataContextはそうtxtBottom.Text変更、または私はデータバインディングなしtxtBottomという名前TextBlockの値を変更することができますどのよう
  2. 適用することができますか?
  3. これらのフィールドやプロパティには、まったくアクセスできますか?

ランタイム: これまでのところ、トリガはWPFでのみ使用できることがわかりました。

私はこのような何かを考える:locationDataは、データを含む私のオブジェクトである

var styledobject = new NiceObject(); 
styledobject.Style = Application.Current.Resources["UserPin"] as Style; 
styledobject.DataContext = locationData; 

誰でも驚くようなことがあれば、私は地図上にアイコンを配置していて、名前を付けたいと思う。

答えて

2
  1. 明示的TextBlockDataContextを適用するべきではありません。 DataContextは、子によって受け継がれるFrameworkElementsです。

  2. これがカスタムコントロールの場合は、OnApplyTemplateメソッドでオーバーライドして使用することができます。 GetTemplateChild(string name)を使用して、コントロール内の名前付き要素への参照を取得します。外部

    public override void OnApplyTemplate() 
    { 
         base.OnApplyTemplate(); 
    
    TextBlock txtBottom = GetTemplateChild("txtBottom") as TextBlock; 
    } 
    
  3. 、あなたがする必要がある場合は、命令的名前でそれを見つけるためにビジュアルツリーを横断する拡張メソッドを使用して、実行時にその特定のコントロールにアクセスすることができます。答えを

    public static T FindChild<T>(this DependencyObject element, string name) 
          where T : FrameworkElement 
    { 
    //Code to find the control 
    } 
    
+0

感謝。 代替案2がこの問題を解決しました。私は、ここでのキーは、OnApplyTemplateであることがわかりました。ヘルプの注釈の下にあるのは、 "インスタンス化された後にテンプレートから来たオブジェクトへの参照を返すためにGetTemplateChildを呼び出します。 /Øyvind –

関連する問題