我有一個ItemsControl系結到串列的:
<ItemsControl x:Name="icFiles" ItemsSource="{Binding Path=files}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Content="" IsChecked="{Binding IsChecked, Mode=TwoWay}" />
<TextBlock x:Name="ThisTextBlock" Text="{Binding FileName}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
private readonly List<FileModel> files = new();
icFiles.ItemsSource = files;
我想突出TextBlock顯示ItemsControl. 為此,我考慮過使用TextPointer:
string? highlightText = "blue";
int highlightTextIndex = ThisTextBlock.Text.IndexOf(highlightText);
if(highlightTextIndex >= 0)
{
TextPointer textStartPointer = ThisTextBlock.ContentStart.DocumentStart.GetInsertionPosition(LogicalDirection.Forward);
TextRange? highlightTextRange = new TextRange(textStartPointer.GetPositionAtOffset(highlightTextIndex), textStartPointer.GetPositionAtOffset(highlightTextIndex highlightText.Length));
highlightTextRange.ApplyPropertyValue(TextElement.BackgroundProperty, Brushes.Blue);
}
}
我如何找到這個ThisTextBlock?
uj5u.com熱心網友回復:
您需要訪問專案容器的內容模板(即專案的DataTemplate)。
如果是ItemsControl,您可以使用以下示例從 獲取命名元素DataTemplate:
for (int itemIndex = 0; itemIndex < this.ItemsControl.Items.Count; itemIndex )
{
var itemContainer = this.ItemsControl.ItemContainerGenerator.ContainerFromIndex(itemIndex) as ContentPresenter;
var textBlock = itemContainer.ContentTemplate.FindName("ThisTextBlock", itemContainer) as TextBlock;
HighlightText(textBlock);
}
在如何: Microsoft Docs:如何:查找 DataTemplate-Generated Elements中可以找到在可視化樹中搜索元素的簡單實作。您可以復制并使用示例的輔助方法FindVisualChild按型別而不是名稱搜索元素。該方法是示例的一部分,該示例展示了如何DataTemplate在使用 aListBox或的情況下獲取 的內容ListView。
如果您沒有修改ListBoxItem模板或不希望它改變,您可以使用這個簡化且更快的版本(查找命名元素):
for (int itemIndex = 0; itemIndex < this.ListBox.Items.Count; itemIndex )
{
var listBoxItemContainer = this.ListBox.ItemContainerGenerator.ContainerFromIndex(itemIndex) as ListBoxItem;
var templateRootBorder = VisualTreeHelper.GetChild(listBoxItemContainer, 0) as Border;
var contentHost = templateRootBorder.Child as ContentPresenter;
var textBlock = contentHost.ContentTemplate.FindName("TD", contentHost) as TextBlock;
}
除特殊用例外,強烈建議使用ListBox代替ItemsControl. ListBox并且ListView都是擴展的ItemsControl. 它們都提供滾動和顯著改進的性能。
uj5u.com熱心網友回復:
首先,您需要從后面的代碼中洗掉Binding。
您可以使用Loaded事件執行此操作,如下所示:
<ItemsControl x:Name="icFiles" ItemsSource="{Binding Path=files}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Content="" IsChecked="{Binding IsChecked, Mode=TwoWay}" />
<TextBlock Loaded="ThisTextBlock_OnLoaded" x:Name="ThisTextBlock" Text="{Binding FileName}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
private void ThisTextBlock_OnLoaded(object sender, RoutedEventArgs e)
{
if (sender is TextBlock tb)
{
string? highlightText = "blue";
int highlightTextIndex = tb.Text.IndexOf(highlightText);
if (highlightTextIndex >= 0)
{
TextPointer textStartPointer = tb.ContentStart.DocumentStart.GetInsertionPosition(LogicalDirection.Forward);
TextRange? highlightTextRange = new TextRange(textStartPointer.GetPositionAtOffset(highlightTextIndex), textStartPointer.GetPositionAtOffset(highlightTextIndex highlightText.Length));
highlightTextRange.ApplyPropertyValue(TextElement.BackgroundProperty, Brushes.Blue);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/481285.html
上一篇:錯誤:CS0019:運算子“ ”不能應用于“TextBox”和“TextBox”型別的運算元WPF c#應用程式
下一篇:用于文本裝飾的wpfc#函式
