1

新しいメッセージがメッセージに追加されたときにWPFアプリケーションにメッセージを表示している
ので、それを強調表示する必要があります。したがって、TextBlockに追加されたテキストを動的に取得したい

私はこのようなxamlを持っています

 <ItemsControl Name="DialogItemsControl" ItemsSource="{Binding Messages, Mode=OneWay}" Background="Transparent" 
                          BorderBrush="Transparent" TargetUpdated="DialogItemsControl_TargetUpdated">
                <ItemsControl.ItemTemplate><!-- For ever message -->
                    <DataTemplate>
                        <Grid Margin="0,0,0,20">
                            <ItemsControl Name="SubDialogItemsControl"
                                  Foreground="{DynamicResource ButtonTextBrush}" 
                                  ItemsSource="{Binding Lines,NotifyOnTargetUpdated=True}"
                                  Margin="0,0,0,12"
                                  Grid.Column="0">
                                <ItemsControl.ItemTemplate><!-- For every line -->
                                    <DataTemplate>
                                        <TextBlock Name="DialogMessageText" 
                                                   Text="{Binding NotifyOnTargetUpdated=True}" 
                                            VerticalAlignment="Top" 
                                            Margin="0,2,0,2" 
                                            TextTrimming="WordEllipsis"/>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>                                    
                            </ItemsControl>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

codebehindクラスのコードは次のようになります。

private void DialogItemsControl_TargetUpdated(object sender, System.Windows.Data.DataTransferEventArgs e)
        {  
          ItemsControl itemControl = sender as ItemsControl;

            ContentPresenter dp =   itemControl.ItemContainerGenerator.ContainerFromItem(itemControl.Items.CurrentItem) as ContentPresenter;

            // Finding textBlock from the DataTemplate that is set on that ContentPresenter
            DataTemplate myDataTemplate = dp.ContentTemplate;
            ItemsControl itc = (ItemsControl)myDataTemplate.FindName("SubDialogItemsControl", dp);
            if (itc != null && itc.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
            {
                ContentPresenter cp = itc.ItemContainerGenerator.ContainerFromIndex(0) as ContentPresenter;
                DataTemplate dt = cp.ContentTemplate;
                TextBlock tb = dt.LoadContent() as TextBlock;               

                tb.TargetUpdated += new EventHandler<System.Windows.Data.DataTransferEventArgs>(myTextBlock_TargetUpdated);
            }            
        }

 void myTextBlock_TargetUpdated(object sender, System.Windows.Data.DataTransferEventArgs e)

       {

            TextBlock tb = sender as TextBlock;
           //When i access the text property of tb, its showing null, how to get the text
        }

textblockのターゲット更新イベントでtextblockのtextプロパティにアクセスすると、nullが表示され、テキストの読み方がわかります。

前もって感謝します

4

1 に答える 1

0

あなたは間違った角度から問題に取り組んでいます (そして、あなたがイベントのサブスクライブを解除しているとは思えないので、プロセスにメモリ リークを追加する可能性があります)。

カスタム TextBlock を作成し、Text プロパティのメタデータをオーバーライドして、テキスト文字列が (PropertyChangedCallback を介して) 変更されたときに背景を数秒間変更する必要があります。

次に、ItemsControl の DataTemplate でそのカスタム TextBlock を使用します。

編集- 他の人がこの機能を必要とする可能性があると思ったので、ここに実際の例を示します:

public class CustomTextBlock : TextBlock
    {
        static CustomTextBlock()
        {
            TextProperty.OverrideMetadata(typeof(CustomTextBlock), new FrameworkPropertyMetadata(null, 
                new PropertyChangedCallback(
                    (dpo, dpce) => 
                    {
                        //Flash the background to yellow for 2 seconds
                        var myTxtblk = dpo as CustomTextBlock;
                        if (myTxtblk != null)
                        {
                            myTxtblk.Background = Brushes.Yellow;
                            Task.Factory.StartNew(
                                () => 
                                {
                                    Thread.Sleep(2000);
                                    Application.Current.Dispatcher.Invoke(
                                        new Action(() => 
                                        {
                                            myTxtblk.Background = Brushes.Transparent;
                                        }));
                                });
                        }
                    })));
        }
    }

次に、XAML ビューで適切な xmlns 名前空間を宣言する必要があり、それを通常の TextBlock のように使用します。

<local:CustomTextBlock Text="{Binding MyDynamicText}"/>

MyDynamicText が変更されると黄色に点滅します (PropertyChanged が発生する場合)。

于 2012-09-28T12:07:29.897 に答える