不显示UserControl

时间:2014-11-06 14:33:42

标签: c# wpf xaml user-controls

编辑:似乎我需要更改RowDefinition的高度。谢谢阿尔瓦罗。然而: 当我想在MainWindow.xaml和MainWindow.xaml.cs中更改它们时,如何引用usercontrol中的不同元素(更改其属性)?

我在同一名称空间中有两个XAML文件。

MainWindow.xaml

List.xaml

当我尝试将List.xaml usercontrol添加到我的mainwindow xaml(即从另一个文件插入xaml)时,它不会显示。

我插入了存在于Lemosystem命名空间和View文件夹中的usercontrol。

xmlns:lemoview="clr-namespace:Lemosystem.View"

我将usercontrol添加到我的MainWindow.xaml:

<lemoview:List/>

什么都没有出现。这是我的List XAML(代码是默认值):

<UserControl x:Class="Lemosystem.View.List"
             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" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Label Content="What do you want to do today?" HorizontalAlignment="Left" Margin="10,96,-83,0" VerticalAlignment="Top" Height="44" Width="373" FontSize="24" FontWeight="Bold"/>
    </Grid>
</UserControl>

我希望我的usercontrol中的标签显示在MainWindow.xaml GUI中,但它没有。

MainWindow.xaml

<Window x:Class="Lemosystem.View.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:lemocontroller="clr-namespace:Lemosystem.Controller"
        xmlns:lemoview="clr-namespace:Lemosystem.View"
        Title="{Binding Path=SystemName}" Height="603" Width="827"
        ResizeMode="NoResize" WindowStartupLocation="Manual"
        >
    <Grid Name="Window" Margin="0,0,2,0">
        <Grid.RowDefinitions>
            <RowDefinition Height="0*"/>
            <RowDefinition/>
        </Grid.RowDefinitions>

...

<lemoview:List/>

...

    </Grid>
</Window>

当我想在MainWindow.xaml和MainWindow.xaml.cs中更改它们时,如何引用usercontrol中的不同元素(更改其属性)?

2 个答案:

答案 0 :(得分:1)

如果你把它放在一个高度=“0”的行上,你觉得怎么样?

将其更改为:

<Window x:Class="Lemosystem.View.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:lemocontroller="clr-namespace:Lemosystem.Controller"
    xmlns:lemoview="clr-namespace:Lemosystem.View"
    Title="{Binding Path=SystemName}" Height="603" Width="827"
    ResizeMode="NoResize" WindowStartupLocation="Manual"
    >
<Grid Name="Window" Margin="0,0,2,0">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
        <lemoview:List/>
</Grid>

答案 1 :(得分:1)

所以,我创建了一个项目:

List.Xaml

  <UserControl x:Class="WpfApplication1.List"
         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" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <Label Content="{Binding TextToDisplay}"
           HorizontalAlignment="Left"
           Margin="10,96,-83,0"
           VerticalAlignment="Top"
           Height="44"
           Width="373"
           FontSize="24"
           FontWeight="Bold" />
</Grid>
</UserControl>

ListViewModel.cs:

    public class ListViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }


    private string textToDisplay;
    public string TextToDisplay
    {
        get { return textToDisplay; }
        set { textToDisplay = value; OnPropertyChanged("TextToDisplay"); }
    }

    public ListViewModel(string value)
    {
        TextToDisplay = value;
    }
}
}

MainWindow.Xaml:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    xmlns:lemoview="clr-namespace:WpfApplication1">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <Button Content="Click Me" HorizontalAlignment="Center" Click="Button_OnClick"></Button>

    <ListView Grid.Row="1" ItemsSource="{Binding MyList}"></ListView>
</Grid>
</Window>

MainWindow.xaml.cs:

      public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        MyList=new ObservableCollection<ListViewModel>();
    }

    private ObservableCollection<ListViewModel> myList;
    public ObservableCollection<ListViewModel> MyList
    {
        get { return myList; }
        set { myList = value; }
    }

    private void Button_OnClick(object sender, RoutedEventArgs e)
    {
        MyList.Add(new ListViewModel("MyValue"));
    }
}

的App.xaml:

    <Application x:Class="WpfApplication1.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:wpfApplication1="clr-namespace:WpfApplication1"
         StartupUri="MainWindow.xaml">
<Application.Resources>

    <DataTemplate DataType="{x:Type wpfApplication1:ListViewModel}">
        <wpfApplication1:List />
    </DataTemplate>

</Application.Resources>

在App.xaml中,我刚刚定义了List.xaml和ListViewModel.cs之间的绑定

MainWindow的viewModel本身就是。

每次单击按钮后,都会创建一个新的ViewModel,并将其添加到具有已定义值的列表中(您需要修改此部件,以设置所需的值)。

我希望它会对你有所帮助!它对我有用。