Пользовательский UserControl не отображается в списке


У меня есть проблема с отображением пользовательских UserControls в моем ListBox программно. Я просто не могу показаться, чтобы выяснить, что случилось. Элемент списка отображается без изображения или текста.

Мой проект состоит из:

  • Главное окно.xaml
  • Главное окно.код XAML.cs
  • cvMenuItem.xaml
  • cvMenuItem.код XAML.cs

Код главного окна.код XAML.cs

private void cvMenuItem_MouseLeftButtonUp_1(object sender, MouseButtonEventArgs e)
{
    lstContacts.Items.Clear();

    cvMenuItem test = new cvMenuItem("test", 
        Environment.GetEnvironmentVariable("USERPROFILE") + @"Downloadsimages.jpg");

    lstContacts.Items.Add(test);
}

Код cvMenuItem.код XAML.cs

public partial class cvMenuItem : UserControl
{
    public cvMenuItem()
    {
        InitializeComponent();
    }

    public cvMenuItem(string text, string Logo)
    {
        this.Height = 50;
        this.Width = 186;
        txtService = new TextBlock() { Width = 100, Height = 50 };
        imgLogo = new Image() { Width = 50, Height = 50 };

        //Just found out, adding the objects as childeren partially works
        this.AddChild(imgLogo);
        //But I can't add txtService as Childeren
        //this.AddChild(txtService);

        this.Services = text;
        this.Logo = Logo;
    }

    public string Services
    {
        get{ return txtService.Text.ToString() }
        set
        {
            txtService.Text = value;
        }
    }

    public string Logo
    {
        get{ return imgLogo.Source.ToString(); }
        set
        {
            var uriSource = new Uri(value);
            imgLogo.Source = new BitmapImage(uriSource);
        }
    }

Мой cvMenuItem.код XAML.cs

<UserControl x:Class="WpfApplication1.cvMenuItem"
             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" 
             mc:Ignorable="d"  Height="50" Width="186">
    <Grid Width="186" VerticalAlignment="Top">
        <Image Name="imgLogo" Height="50" Width="50" HorizontalAlignment="Left" VerticalAlignment="Top" OpacityMask="{DynamicResource {x:Static SystemColors.ActiveCaptionTextBrushKey}}" />
        <TextBlock Name="txtService" HorizontalAlignment="Left" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Bottom" Height="18" Width="121" Margin="70,0,0,18" RenderTransformOrigin="0.499,1.932"/>
    </Grid>
</UserControl>
1 2

1 ответ:

Прежде всего вам нужно вызвать InitializeComponent в пользовательском конструкторе, который вы добавили, так как это необходимо для правильной обработки XAML. В противном случае все элементы управления, добавляемые в XAML, будут иметь значение null при запуске приложения.

Кроме того, нет смысла создавать TextBlock и Image снова в коде-за. Вы просто должны использовать те, которые созданы в XAML.

Итак, чтобы заставить его работать, измените код в конструкторе на следующий:

public cvMenuItem(string text, string Logo)
{
    InitializeComponent();

    this.Height = 50;
    this.Width = 186;

    this.Services = text;
    this.Logo = Logo;
}