WPF UserControl Design Time Size

后端 未结 9 834
[愿得一人]
[愿得一人] 2020-11-30 22:36

When creating a UserControl in WPF, I find it convenient to give it some arbitrary Height and Width values so that I can view my changes in the Visual Studio designer. When

相关标签:
9条回答
  • 2020-11-30 22:55

    I do this all the time. Simply set the width and height values to "auto" where you instantiate your control, and this will override the design-time values for that UserControl.

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

    Another option is to set a combination of MinWidth and MinHeight to a size that allows design-time work, while Width and Height remain "auto". Obviously, this only works if you don't need the UserControl to size smaller than the min values at runtime.

    0 讨论(0)
  • 2020-11-30 22:57

    Use MinWidth and MinHeight on the control. That way, you'll see it in the designer, and at runtime it will size the way you want.

    0 讨论(0)
  • 2020-11-30 23:00

    Some have suggested using the LicenseManager.UsageMode property which I've never seen before but I have used the following code.

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

    esskar,

    I just want to add that you should generally always call the method of the base when overriding an "On" method.

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

    Great workaround by the way, I'm using it myself now too.

    0 讨论(0)
  • 2020-11-30 23:04

    I do it similar, but my solution assures that if you add your control to an container in design mode, it will appear reasonably.

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

    what do you think?

    0 讨论(0)
  • 2020-11-30 23:05

    For Blend, a little known trick is to add these attributes to your usercontrol or window:

     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"
    

    This will set the design height and width to 500 and 600 respectively. However this will only work for the blend designer. Not the Visual Studio Designer.

    As far as the Visual Studio Designer your technique is all that works. Which is why I don't use the Visual Studio Designer. ;)

    0 讨论(0)
  • 2020-11-30 23:07

    I was looking for similar solution like the one used in Blend and with your mentions I created simple behavior class with two attached properties Width & Height that are applied only in DesinTime

    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
    
    }
    

    Then in your UserControl you just set these properties in 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>
    
    0 讨论(0)
提交回复
热议问题