it-swarm-ko.tech

WPF UserControl 디자인 시간 크기

WPF에서 UserControl을 만들 때 Visual Studio 디자이너에서 변경 사항을 볼 수 있도록 임의의 Height 및 Width 값을 지정하는 것이 편리하다는 것을 알았습니다. 그러나 컨트롤을 실행할 때 높이와 너비를 정의하지 않으면 컨트롤이 확장되어 컨테이너에 넣은 컨테이너를 채울 수 있습니다. 전에 높이와 너비 값을 제거하지 않고도 동일한 기능을 달성 할 수있는 방법 내 통제력을 구축? 또는 부모 컨테이너에서 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>
51
Joseph Sturtevant

Visual Studio에서 너비 및 높이 특성을 UserControl XAML에 추가하지만 코드 숨김에서

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

컨트롤이 디자인 모드에서 실행 중인지 확인합니다. 그렇지 않은 경우 (즉, 런타임)는 XAML에서 너비 및 높이 속성을 제거 할 때 설정 한 값인 너비 및 높이를 NaN (숫자가 아님)으로 설정합니다.

따라서 디자인 타임에 사전 설정된 너비와 높이 (사용자 정의 컨트롤을 양식에 넣는 경우 포함)가 있으며 런타임에는 부모 컨테이너에 따라 도킹됩니다.

희망이 도움이됩니다.

38
Alex Duggleby

Blend의 경우 약간의 트릭은 이러한 속성을 사용자 정의 컨트롤이나 창에 추가하는 것입니다.

 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를 사용하지 않습니다. ;)

79
Brian Leahy

다음은 Silverlight Designer의 디자인 타임 특성 목록입니다. 그것들은 WPF 디자이너와 동일합니다.

Designer에서 사용 가능한 모든 d: 값 (예 : d:DesignHeight, d:DesignWidth, d:IsDesignTimeCreatable, d:CreateList 및 기타 여러 가지가 나열됩니다.

8
CLaRGe

나는 항상 이것을한다. 컨트롤을 인스턴스화 할 때 너비와 높이 값을 "자동"으로 설정하면 해당 UserControl의 디자인 타임 값이 무시됩니다.

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

또 다른 옵션은 MinWidth와 MinHeight의 조합을 디자인 타임 작업을 허용하는 크기로 설정하고 너비와 높이는 "자동"으로 유지하는 것입니다. 분명히 이것은 런타임에 최소값보다 작은 크기로 UserControl이 필요하지 않은 경우에만 작동합니다.

6
AndyL

나는 Blend에서 사용 된 것과 비슷한 솔루션을 찾고 있었고 언급과 함께 DesinTime에만 적용되는 두 가지 속성 인 Width & Height가있는 간단한 동작 클래스를 만들었습니다.

 공개 정적 클래스 DesignBehavior 
 {
 개인 정적 읽기 전용 유형 OwnerType = typeof (DesignBehavior); 
 
 #region Width 
 
 공개 정적 읽기 전용 DependencyProperty WidthProperty = 
 DependencyProperty.RegisterAttached (
 "Width", 
 typeof (double), 
 OwnerType, 
 new FrameworkPropertyMetadata (double.NaN, new PropertyChangedCallback (WidthChangedCallback))); 
 
 공개 정적 double GetWidth (DependencyObject depObj) 
 {
 return (double) depObj. GetValue (WidthProperty); 
} 
 
 public static void SetWidth (DependencyObject depObj, double value) 
 {
 depObj.SetValue (WidthProperty, 값 ); 
} 
 
 private static void WidthChangedCallback (DependencyObject depObj, DependencyPropertyChangedEventArgs e) 
 {
 if (DesignerPropertie s.GetIsInDesignMode (depObj)) {
 depObj.SetValue (FrameworkElement.WidthProperty, e.NewValue); 
} 
} 
 
 #endregion 
 
 #region Height 
 
 공개 정적 읽기 전용 DependencyProperty HeightProperty = 
 DependencyProperty.RegisterAttached (
 "Height", 
 typeof (double), 
 OwnerType, 
 new FrameworkPropertyMetadata (double.NaN, new PropertyChangedCallback (HeightChangedCallback))); 
 
 public static double GetHeight (DependencyObject depObj) 
 {
 반환 (더블) depObj.GetValue (HeightProperty); 
} 
 
} ) 
 {
 depObj.SetValue (HeightProperty, value); 
} 
 
 
 private static void HeightChangedCallback (DependencyObject depObj, DependencyPropertyChanged조차도 tArgs 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> 
2
Ondrej

컨트롤에서 MinWidth 및 MinHeight를 사용하십시오. 그렇게하면 디자이너에서 볼 수 있으며 런타임에 원하는 크기로 조정됩니다.

1
Roger Dufresne

일부는 전에 본 적이없는 LicenseManager.UsageMode 속성을 사용하도록 제안했지만 다음 코드를 사용했습니다.

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

esskar,

나는 단지 "On"메소드를 오버라이드 할 때 항상베이스의 메소드를 호출해야한다고 덧붙이고 싶다.

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

    ...
}

그건 그렇고 훌륭한 해결책, 지금도 나 자신을 사용하고 있습니다.

0
jpierson

나는 비슷한 것을하지만 내 솔루션은 디자인 모드에서 컨트롤을 컨테이너에 추가하면 합리적으로 나타납니다.

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

어떻게 생각해?

0
esskar

이 솔루션의 원래 답변자에게 감사합니다! 관심있는 사람들을 위해 여기 VB가 있습니다.

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