Установить содержимое элемента без свойства Name - PullRequest
0 голосов
/ 04 июля 2019

Я использую ListBox в сочетании с ObservableCollection. Контент устанавливается с помощью TemplateSelector (TextBlock или Label). Текст должен быть отформатирован (например, с Run-Tags в Code-behind), но я не могу получить доступ к пунктам. Есть ли решение получить элементы?

Я пробовал использовать OfType <>, но это работает только на панелях. Я искал атрибут детей, но для ListBoxes его нет. Установка свойства Name через привязку невозможна для UId и Name. IEnumerator для LogicalChildren не работает и выполняет итерацию по всему контенту каждый раз, когда добавляется новый элемент, это не так оптимально. Вот минимальный пример.

<Window.Resources>
     <DataTemplate x:Key="TextBlockTemplate">
        <StackPanel>
            <TextBlock />
        </StackPanel>
    </DataTemplate>

     <DataTemplate x:Key="LabelTemplate">
        <StackPanel>
            <Label/>
        </StackPanel>
    </DataTemplate>

    <local:myTemplateSelector x:Key="myTemplateSelector" x:Name="myTemplateSelector" TextBlockTemplate="{StaticResource TextBlockTemplate}" LabelTemplate="{StaticResource LabelTemplate}"/>
</Window.Resources>

<Grid Margin="0">
    <ListBox Name="mylist" Grid.Row="3" 
             ScrollViewer.VerticalScrollBarVisibility="Visible" 
             ScrollViewer.HorizontalScrollBarVisibility="Disabled"  
             ItemsSource="{Binding _listEntries}"                 
             ItemTemplateSelector="{StaticResource myTemplateSelector}"
             >
    </ListBox>
</Grid>

Привет и спасибо:)

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Теперь я нашел решение. Я сделал TextBlock и Label как пользовательский элемент управления и установил свойство Name. В коде позади у меня есть доступ к DataContext, и элемент может установить себя.

<UserControl x:Class="Test.TextBlockControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:local="clr-namespace:TextBlockControl"
         Loaded="UserControl_Loaded">
<Grid>
    <StackPanel HorizontalAlignment="Stretch"  Margin="0,0,0,0">
        <TextBlock Name="textBlock"/>
    </StackPanel>
</Grid>

В коде я теперь могу получить доступ к значениям и установить:

    public partial class TextBlockControl : UserControl
{
    public List<string> name => DataContext as List<string>;

    public TextBlockControl()
    {
        InitializeComponent();
    }

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
            foreach (var t in name)
            {
                var run = new Run(t.Text);
                if (t.IsHighlighted)
                {
                    run.Foreground = Brushes.Green;
                }
                else
                {
                    run.Foreground = Brushes.Red;
                }
                textBlock.Inlines.Add(run);
            }
        }
    }
}

В MainWindow dataTemplate затем ссылается на UserControl (корень - это пространство имен):

<root:PickControl />
0 голосов
/ 04 июля 2019

TextBlock имеет свойство Inlines , которое возвращает элементы Inline, составляющие содержимое TextBlock.

У Label есть свойство Content, которое вы, в зависимости от того, как вы его используете, можете привести к Panel.

Для * 1013 нет встроенных элементов*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...