programing

WPF 사용자 제어 설계 시간 크기

yellowcard 2023. 4. 15. 08:42
반응형

WPF 사용자 제어 설계 시간 크기

WPF에서 UserControl을 만들 때 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>

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

Visual Studio에서 너비 및 높이 속성을 UserControl XAML에 추가하지만 코드 뒤에 이 속성을 삽입합니다.

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

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

따라서 디자인 타임에는 미리 설정된 폭과 높이(사용자 컨트롤을 폼에 넣는 경우 포함)가 있고 런타임에는 부모 컨테이너에 따라 도킹됩니다.

도움이 됐으면 좋겠다.

다음은 Silverlight Designer의 디자인 타임 속성 목록입니다.WPF 설계자도 마찬가지입니다.

에는 모든 있습니다.d:할 수 있는 값예: 음음 such such the values values values values values values values values values values values ) 。d:DesignHeight,d:DesignWidth,d:IsDesignTimeCreatable,d:CreateList그리고 다른 몇 개.

나는 항상 이런 식이야.컨트롤을 인스턴스화할 때 폭과 높이 값을 "자동"으로 설정하면 해당 UserControl의 설계 시간 값이 덮어씁니다.

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

또 다른 옵션은 MinWidth와 MinHeight의 조합을 디자인 타임 작업을 허용하는 크기로 설정하고 폭과 높이는 "자동"으로 유지하는 것입니다.이 기능은 실행 시 최소값보다 작은 크기로 사용자 제어가 필요하지 않은 경우에만 작동합니다.

Blend에서 사용한 것과 유사한 솔루션을 찾고 있었는데, 당신의 언급으로 Desin Time에서만 적용되는 두 가지 속성인 Width & Height를 가진 심플한 동작 클래스를 만들었습니다.

퍼블릭 스태틱클래스 DesignBehavior{private static readonly Type OwnerType = type of(DesignBehavior);
#지역폭
공용 정적 읽기 전용 DependencyProperty WidthProperty =Dependency Property.등록 첨부("폭",타입 오브(더블),오너 타입,새로운 Framework Property Metadata(더블).NaN, 새로운 Property Changed Callback(Width Changed Callback);

public static double GetWidth(Dependency Object depObj){dep Obj를 반환한다.GetValue(WidthProperty);
}
public static void SetWidth(DependencyObject depObj, 이중값){디포비지SetValue(WidthProperty, 값);
}
프라이빗 스태틱 void Width Changed Callback(Dependency Object dep Obj, Dependency Property Changed Event Args e){if(Designer Properties).GetIsInDesignMode(depObj) {디포비지SetValue(FrameworkElement).Width Property, e.새로운 가치);
}}
#엔드리젼
#지역 높이
공용 정적 읽기 전용 DependencyProperty HeightProperty =Dependency Property.등록 첨부("높이",타입 오브(더블),오너 타입,새로운 Framework Property Metadata(더블).NaN, 새로운 Property Changed Callback(Height Changed Callback);

public static double GetHeight(Dependency Object depObj){dep Obj를 반환한다.GetValue(HeightProperty);
}
public static void SetHeight(DependencyObject depObj, 이중값){디포비지SetValue(HeightProperty, 값);
}

프라이빗 스태틱 void HeightChangedCallback(DependencyObject depObj, DependencyPropertyChangedEventArgs e){if(Designer Properties).GetIsInDesignMode(depObj) {디포비지SetValue(FrameworkElement).HeightProperty, e.새로운 가치);
}}
#엔드리젼
}

그런 다음 UserControl에서 이러한 속성을 Xaml에서 설정합니다.

<UserControl x:Class="Extended Data Grid(확장 데이터 그리드).Views. PersonOverView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns: syslog="http://schemas.microsoft.com/wpf/2008/toolkit"xmlns:b="clr-namespace:ExtendedDataGrid.Behaviors"b: Design Behavior.폭="600" b:DesignBehavior.높이="200"><그리드>...
</그리드></사용자 제어>

컨트롤에서 MinWidth 및 MinHeight를 사용합니다.이렇게 하면 디자이너에서 볼 수 있고 실행 시 원하는 크기로 크기가 조정됩니다.

저도 비슷하지만, 제 솔루션에서는 디자인 모드에서 컨테이너에 컨트롤을 추가하면 합리적으로 표시됩니다.

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

당신은 어떻게 생각하나요?

이 솔루션에 대한 최초 답변자에게 감사드립니다.관심 있는 분들을 위해 VB는 다음과 같습니다.

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

일부에서는 License Manager를 사용할 것을 제안하고 있습니다.처음 보는 UsageMode 속성입니다만, 다음의 코드를 사용하고 있습니다.

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

esskar,

"On" 메서드를 재정의할 때는 일반적으로 항상 베이스 메서드를 호출해야 한다는 점을 덧붙입니다.

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

    ...
}

훌륭한 회피책입니다만, 저도 지금 사용하고 있습니다.

언급URL : https://stackoverflow.com/questions/75495/wpf-usercontrol-design-time-size

반응형