在WPF中创建UserControl时,我发现给它一些任意的Height和Width值很方便,这样我就可以在Visual Studio设计器中查看我的更改.但是,当我运行控件时,我希望高度和宽度未定义,以便控件将展开以填充我放入的任何容器.如何在不必删除高度和宽度值之前实现相同的功能建立我的控制?(或者不在父容器中使用DockPanel.)
以下代码演示了此问题:
<Window x:Class="ExampleApplication3.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:ExampleApplication3"
Title="Example" Height="600" Width="600">
<Grid Background="LightGray">
<loc:UserControl1 />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
以下定义UserControl1
在设计时合理显示,但在运行时显示为固定大小:
<UserControl x:Class="ExampleApplication3.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<Grid Background="LightCyan" />
</UserControl>
Run Code Online (Sandbox Code Playgroud)
以下定义UserControl1
在设计时显示为点,但Window1
在运行时展开以填充父级:
<UserControl x:Class="ExampleApplication3.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid Background="LightCyan" />
</UserControl>
Run Code Online (Sandbox Code Playgroud) 我将文本框绑定到对象,如下所示:
<TextBlock d:DataContext="{d:DesignInstance ViewModel:TaskVM }"
Text="{Binding Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown">
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
现在我想知道如何在设计过程中显示模拟数据.我尝试过这样的事情:
<TextBlock Text="{Binding Path=Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown">
<d:DesignProperties.DataContext>
<ViewModel:TaskVM Title="Mock"/>
</d:DesignProperties.DataContext>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
但是,由于TaskVM没有默认的ctor,我找到了"No default constructor".
我知道当我使用d:DataContext="{d:DesignInstance ViewModel:TaskVM }"
它时会创建一个模拟数据类型.有没有办法让我设置这个模拟类型的属性?
谢谢!
我有一个主要的wpf窗口:
<Window x:Class="NorthwindInterface.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ViewModels="clr-namespace:NorthwindInterface.ViewModels" Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<ViewModels:MainViewModel />
</Window.DataContext>
<ListView ItemsSource="{Binding Path=Customers}">
</ListView>
</Window>
Run Code Online (Sandbox Code Playgroud)
而MainViewModel是这样的:
class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
public MainViewModel()
{
Console.WriteLine("test");
using (NorthwindEntities northwindEntities = new NorthwindEntities())
{
this.Customers = (from c in northwindEntities.Customers
select c).ToList();
}
}
public List<Customer> Customers { get;private set; }
Run Code Online (Sandbox Code Playgroud)
现在问题是在designermode中我看不到我的MainViewModel,它突出显示它无法创建MainViewModel的实例.它正在连接到数据库.这就是为什么(当我评论代码时问题得到解决).
但我不希望这样.关于此的最佳实践的任何解决方案?
为什么在使用MVVM时这会起作用:
/// <summary>
/// Initializes a new instance of the <see cref="MainViewModel"/> class.
/// </summary>
public MainViewModel()
{ …
Run Code Online (Sandbox Code Playgroud) 我有一个相当基本的WPF UI,用户请求导致我的TabControl中打开一个新选项卡.TabControl绑定到ObservableCollection<ViewModelBase>
我将ViewModel实例添加到此集合中,并根据以下模板显示相应选项卡的内容:
<DataTemplate DataType="{x:Type viewModels:UserUploadsViewModel}">
<userControls:UserUploads />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
现在让我们说在UserUploads控件内部,我想在XAML中连接一个VM以帮助设计,如下所示:
<UserControl x:Class=".....UserUploads"
.....
DataContext="{Binding Source={StaticResource ViewModelLocater},
Path=UserAdministrationViewModel}">
Run Code Online (Sandbox Code Playgroud)
此属性将在运行时返回具有实时服务的VM,并在设计时返回具有模拟数据的VM.
问题:这个XAML会干扰我在将TabItems内容绑定到ViewModel实例时所做的事情,并依赖上面的dataTemplate来呈现正确的View吗?如果是这样,有没有办法让这两个概念一起工作?
我正在使用设计时命名空间来使用设计时属性和元素。我用
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
Run Code Online (Sandbox Code Playgroud)
现在,我需要定义设计时间元素,比方说
<d:TextBlock Text="design time text block" />
Run Code Online (Sandbox Code Playgroud)
但是在运行时,我想显示其他文本块:
<TextBlock Text="runtime text block" />
Run Code Online (Sandbox Code Playgroud)
如何定义这两个元素,以便显示设计时元素而不是各自的运行时元素?
我弄清楚的方法是:
<Grid>
<d:TextBlock Text="design time text block" />
<TextBlock Text="runtime text block" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
但我不想定义额外的容器。我也可以使用 <d:Grid>`,但它只是在运行时省略了整个网格和文本块。
我知道我可以使用d:Text
设计时属性,但在实际情况下我需要在元素上设置附加属性,其中已经有自己的命名空间,例如。ns:AttachedProp
我不能使用两个命名空间,如d:ns:AttachedProp
.
我有一个包含列表框的视图(usercontrol).在运行时,列表框将填充另一个视图的实例(也是用户控件).如何在设计时(在Blend和Cider中)使用自己填充样本数据的样本视图填充列表框?
我的设计师在 MVVM 项目上遇到了问题。
我有TreeView
一个自定义DataTemplate
:
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Name="img" Width="20" Height="20" Stretch="Fill"
Source="{Binding
RelativeSource={RelativeSource
Mode=FindAncestor,
AncestorType={x:Type TreeViewItem}},
Path=Header,
Converter={StaticResource HeaderToImageConverter}}"
/>
<TextBlock Text="{Binding}" Margin="5,0" />
</StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
资源声明:
<Window x:Class="BlobWorld.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Core="clr-namespace:BlobWorld;assembly="
xmlns:helper="clr-namespace:BlobWorld.Helper"
mc:Ignorable="d"
Title="MainWindow" Height="350.459" Width="746.561"
DataContext="{DynamicResource MainWindowViewModel}">
<Window.Resources>
<helper:HeaderToImageConverter x:Key="HeaderToImageConverter"/>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)
我的转换器是:
public class HeaderToImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((value as string).Contains(@"."))
{
Uri uri = new Uri("pack://application:,,,/images/File.png");
BitmapImage source …
Run Code Online (Sandbox Code Playgroud) wpf ×6
mvvm ×4
.net ×3
c# ×3
xaml ×2
autosize ×1
blend ×1
data-binding ×1
design-time ×1
designer ×1
ioexception ×1