在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>

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>

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>

===============>>#1 票数:79

对于Blend,一个鲜为人知的技巧是将这些属性添加到您的usercontrol或窗口:

 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d"
       d:DesignHeight="500" d:DesignWidth="600"

这将设计高度和宽度分别设置为500和600。 但是这只适用于混合设计师。 不是Visual Studio Designer。

就Visual Studio Designer而言,您的技术是可行的。 这就是我不使用Visual Studio Designer的原因。 ;)

===============>>#2 票数:38 已采纳

在Visual Studio中,将“宽度”和“高度”属性添加到UserControl XAML,但在代码隐藏中插入此属性

public UserControl1()
{
    InitializeComponent();
    if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
    {
        this.Width = double.NaN; ;
        this.Height = double.NaN; ;
    }
}

这将检查控件是否在设计模式下运行。 如果不是(即运行时),则将宽度和高度设置为NaN(非数字),如果删除XAML中的“宽度”和“高度”属性,则将其设置为值。

因此,在设计时,您将拥有预设的宽度和高度(包括将用户控件放在表单中),并且在运行时它将根据其父容器进行停靠。

希望有所帮助。

===============>>#3 票数:8

以下是Silverlight Designer中的设计时属性列表。 它们与WPF设计者相同。

它列出了Designer中可用的所有d:值,例如d:DesignHeightd:DesignWidthd:IsDesignTimeCreatabled:CreateList和其他几个。

===============>>#4 票数:6

我一直这样做。 只需将宽度和高度值设置为“auto”,即可实例化控件,这将覆盖该UserControl的设计时值。

即: <loc:UserControl1 Width="auto" Height="auto" />

另一种选择是将MinWidth和MinHeight的组合设置为允许设计时工作的大小,而宽度和高度保持“自动”。 显然,只有在运行时不需要UserControl的大小小于最小值时,这才有效。

===============>>#5 票数:2

我正在寻找类似于Blend中使用的类似解决方案,并且您提到我创建了简单的行为类,其中包含仅在DesinTime中应用的两个附加属性Width&Height

public static class DesignBehavior 
{
    private static readonly Type OwnerType = typeof (DesignBehavior);

    #region Width

    public static readonly DependencyProperty WidthProperty =
        DependencyProperty.RegisterAttached(
            "Width",
            typeof (double),
            OwnerType,
            new FrameworkPropertyMetadata(double.NaN, new PropertyChangedCallback(WidthChangedCallback)));

    public static double GetWidth(DependencyObject depObj)
    {
        return (double)depObj.GetValue(WidthProperty);
    }

    public static void SetWidth(DependencyObject depObj, double value)
    {
        depObj.SetValue(WidthProperty, value);
    }

    private static void WidthChangedCallback(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
    {
        if (DesignerProperties.GetIsInDesignMode(depObj)) {
            depObj.SetValue(FrameworkElement.WidthProperty, e.NewValue);
        }
    }

    #endregion

    #region Height

    public static readonly DependencyProperty HeightProperty =
        DependencyProperty.RegisterAttached(
            "Height",
            typeof (double),
            OwnerType,
            new FrameworkPropertyMetadata(double.NaN, new PropertyChangedCallback(HeightChangedCallback)));

    public static double GetHeight(DependencyObject depObj)
    {
        return (double)depObj.GetValue(HeightProperty);
    }

    public static void SetHeight(DependencyObject depObj, double value)
    {
        depObj.SetValue(HeightProperty, value);
    }


    private static void HeightChangedCallback(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
    {
        if (DesignerProperties.GetIsInDesignMode(depObj)) {
            depObj.SetValue(FrameworkElement.HeightProperty, e.NewValue);
        }
    }

    #endregion

}

然后在您的UserControl中,您只需在Xaml中设置这些属性

<UserControl x:Class="ExtendedDataGrid.Views.PersonOverviewView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:tool="http://schemas.microsoft.com/wpf/2008/toolkit"
    xmlns:b="clr-namespace:ExtendedDataGrid.Behaviors"
    b:DesignBehavior.Width="600" b:DesignBehavior.Height="200">
    <Grid>
         ...
    </Grid>
</UserControl>

===============>>#6 票数:1

在控件上使用MinWidth和MinHeight。 这样,您将在设计器中看到它,并且在运行时它将按照您想要的方式调整大小。

===============>>#7 票数:0

有人建议使用我以前从未见过的LicenseManager.UsageMode属性,但我使用了以下代码。

if(!DesignerProperties.GetIsInDesignMode(this))
{
    this.Width = double.NaN;
    this.Height = double.NaN;
}

esskar,

我只想补充一点,在覆盖“On”方法时,通常应该总是调用base的方法。

protected override void OnVisualParentChanged(DependencyObject oldParent)
{
    base.OnVisualParentChanged(oldParent);

    ...
}

顺便说一句很好的解决方法,我现在也在使用它。

===============>>#8 票数:0

我这样做,但我的解决方案确保如果您在设计模式下将控件添加到容器,它将合理地显示。

protected override void OnVisualParentChanged(DependencyObject oldParent)
{
    if (this.Parent != null)
    {
       this.Width = double.NaN;
       this.Height = double.NaN;
    }
}

你怎么看?

===============>>#9 票数:0

感谢这个解决方案的原始回答者! 对于那些感兴趣的人,这里是VB:

If LicenseManager.UsageMode <> LicenseUsageMode.Designtime Then
    Me.Width = Double.NaN
    Me.Height = Double.NaN
End If

  ask by Joseph Sturtevant translate from so

未解决问题?本站智能推荐:

1回复

WPF - 使用用户控件并设置设计时间高度和宽度

也许有人有这个答案。 我正在设计要添加到其他容器的用户控件,它们是为了适应容器的可用空间。 所以这意味着不设置用户控件的高度和宽度。 但是当我设计控件时,我希望看到它具有宽度和高度。 所以我当然不必继续设置和删除控件的wdth和高度 怎么办呢??? 马尔科姆
1回复

如何根据其内容自动调整Silverlight 3用户控件的大小?

使用Silverlight 3,我试图重新创建类对象的可视化效果,如Visual Studio的类图中所示。 但是,我的对象将代表数据库对象而不是类定义。 如以下两个图像所示,我已经部分成功。 替代文字http://img41.imageshack.us/img41/5669/tabl
1回复

如何使Windows Forms UserControl自动调整为停靠内容的大小?

我有一个UserControl ,它将放入DevExpress PopupControlContainer 。 我希望UserControl能够自动调整大小以至少适合其内容,这是一个PanelControl ,其中包含两个按钮,分别停靠在底部,而ListBoxControl停靠以填充其余部
1回复

WPF:通过高度网格快速自动调整大小

我必须将包含多个表的窗口实现到一个滚动查看器中。 这意味着该表应被内容拉伸。 用户能够向这些表添加/删除项目(行)。 以下模型显示了该概念。 主要问题是网格不应具有滚动条,而应具有动态高度。 目前,此接口已在ScrollViewer内部实现为ItemsControl。 在I
2回复

在TabItem / StackPanel中自动调整WPF框架对象的大小

我希望框架控件自动调整大小以填充TabItem内的屏幕。 下面的代码将其渲染得非常小。 我宁愿不设置静态的高度和宽度。 这是XAML
4回复

Wpf控制大小到内容?

如何使WPF控件根据其中的内容更改其大小?
2回复

在WPF中使用ListView是否有一种优雅的方法来自动调整项目大小?

最近,我写了我的第一个WPF应用程序,其中包含从Web服务轮询的项目列表。 这些项目通过GridView在ListView中显示/数据绑定。 后台线程定期轮询Web服务并更新列表。 如果说,如果我最初绑定到ListView的三个项目只是显示一个描述和这三个描述,例如: 后来添加
1回复

WinForms中WPF Elementhost的自动大小无法正常工作

制作了一个dummyapp来说明我在现实应用程序中遇到的问题: 我有一个WPF用户控件,其内容如下: Datacontext是这样的ViewModel: RelayCommand实现ICommand。 单击添加按钮后,将运行“ AddCommand”,并将一个项目添加到集
1回复

如何在设计时获取WPF UserControl更新?

我正在基于UserControl类制作自定义WPF控件。 这是一个简单的复选框,带有两条对角线的矩形,当我缩放整个控件时可以正确缩放。 这是XAML: 我将DependencyProperty IsChecked添加到CustomControl类。 如果IsChecked为tru
1回复

WPF UserControl在设计时未呈现

我对WPF比较陌生,因此如果我缺少基本知识,我深表歉意。 我有一个用户控件,在其中声明了名为PT1x,PT1y,PT2x,PT2y的依赖项属性: 等等... 我在xaml中设置usercontrol的datacontext: DataContext =“ {Bindin