1

WPFウィンドウがあり、プロパティを取得しようとしていWidthます。コードをどこに表示しようとしても、常にとして返されNaNます。私はインターネットで調べて、ActualWidth代わりに実際に使用する必要があることを読みましたが、これは何があっても0を返します。

ラグを取り除き、ウィンドウの幅の実際の値を取得するにはどうすればよいですか?

XAML:

<Window x:Name="TableWindow" x:Class="QueryBuilder.DatabaseTable"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        WindowStyle="None" Background="Transparent" SizeToContent="WidthAndHeight" ResizeMode="CanResize">
    <Grid>
        <DockPanel>
            <StackPanel Name="titleBar" DockPanel.Dock="Top" Height="28" FlowDirection="RightToLeft" Orientation="Horizontal" Background="AliceBlue">
                <Button x:Name="btnClose" Margin="0,0,5,0" Click="btnClose_Click">
                </Button>
                <Button>
                </Button>
                <Button>
                </Button>
                <Button x:Name="btnAll">ALL</Button>
                <Label Name="lblTableName" FontSize="15" Margin="50,0,0,0"></Label>
            </StackPanel>
            <StackPanel Orientation="Vertical" Name="spFields">
            </StackPanel>
        </DockPanel>
    </Grid>
</Window>

XAML.cs:

public DatabaseTableWindow(string tableName, DataTable fields, string primaryKey)
        {
            InitializeComponent();
            this.tableName = tableName;
            this.fields = fields;
            this.primaryKey = primaryKey;
            lblTableName.Content = tableName;
            double x = this.ActualWidth;
        }
4

4 に答える 4

2

ええ、ActualWidthあなたは探す必要があります。しかし、windowのコンストラクターは、以来、それを取得するための適切な場所ではありませんwindow is not rendered yet。代わりにLoadedイベントを使用してください-

public DatabaseTableWindow(string tableName, DataTable fields, string primaryKey)
{
    InitializeComponent();
    this.tableName = tableName;
    this.fields = fields;
    this.primaryKey = primaryKey;
    lblTableName.Content = tableName;
    Loaded += new RoutedEventHandler(MainWindow_Loaded);        
}

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    double x = this.ActualWidth;
}

編集

の代わりに、コンストラクターでイベントにLoadedフックしてみてください-ContentRendered

this.ContentRendered += new EventHandler(MainWindow_ContentRendered);

void MainWindow_ContentRendered(object sender, EventArgs e)
{
   double x = this.ActualWidth;
}
于 2012-10-21T08:42:26.427 に答える
1

WPFマルチドキュメントインターフェイスを使用していると仮定します。

MdiChildで幅プロパティの計算を行う必要がある場合は、コンテナに追加する前に、MdiChildオブジェクトのLoaded-Eventにバインドできます。

        var mdiChild = new MdiChild
                           {
                               Title = "Window Using Code",
                               Content = new ExampleControl(),
                               Width = 714,
                               Height = 734,
                               Position = new Point(200, 30)
                           };
    mdiChild.Loaded += new RoutedEventHandler(mdiChild_Loaded);

        Container.Children.Add(mdiChild);

    void mdiChild_Loaded(object sender, RoutedEventArgs e)
    {
        if (sender is MdiChild)
        {
            var width = (sender as MdiChild).Width;
            Debug.WriteLine("Width: {0}", width);
        }
    }
于 2012-10-21T09:49:46.420 に答える
1

この質問に関してWPFルームでチャットしているので、これは一見簡単なことと複雑な問題でした。

mdiChildに幅/高さを設定すると、サイズ変更機能が失われます。だから私は私たちのチャットに従ってこの問題を解決したように見える修正の要点を投稿しました


そのため、サイズをバインドするために、通常のバインド(テストプロジェクトからのこのコピーペースト)を使用しました。

<Window x:Class="TestApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:MDI="clr-namespace:WPF.MDI;assembly=WPF.MDI" xmlns:TestApplication="clr-namespace:TestApplication"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Title="MainWindow">
    <MDI:MdiContainer Name="mainContainer">
        <MDI:MdiChild x:Name="mdiChild" MaximizeBox="False" MinimizeBox="False" Resizable="True" ShowIcon="False" Width="{Binding Width, ElementName=childElement}" Height="{Binding Height, ElementName=childElement}">
            <TestApplication:DatabaseTable x:Name="childElement"/>
        </MDI:MdiChild>
    </MDI:MdiContainer>
</Window>

これにより、主な幅と高さの問題が解決されます。


このコードは、WPF.MDIライブラリのMdiChild.csチェンジセット81799サイズ変更ハンドラーソースを置き換える必要があります(そこにある既存の関連コードをこれに置き換えることができます)。

/// <summary>
/// Handles the DragDelta event of the ResizeLeft control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Controls.Primitives.DragDeltaEventArgs"/> instance containing the event data.</param>
private void ResizeLeft_DragDelta(object sender, DragDeltaEventArgs e)
{
    if (ActualWidth - e.HorizontalChange < MinWidth)
        return;

    double newLeft = e.HorizontalChange;

    if (Position.X + newLeft < 0)
        newLeft = 0 - Position.X;

    Width = ActualWidth - newLeft;
    Position = new Point(Position.X + newLeft, Position.Y);

    if (sender != null)
        Container.InvalidateSize();
}

/// <summary>
/// Handles the DragDelta event of the ResizeTop control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Controls.Primitives.DragDeltaEventArgs"/> instance containing the event data.</param>
private void ResizeTop_DragDelta(object sender, DragDeltaEventArgs e)
{
    if (ActualHeight - e.VerticalChange < MinHeight)
        return;

    double newTop = e.VerticalChange;

    if (Position.Y + newTop < 0)
        newTop = 0 - Position.Y;

    Height = ActualHeight - newTop;
    Position = new Point(Position.X, Position.Y + newTop);

    if (sender != null)
        Container.InvalidateSize();
}

/// <summary>
/// Handles the DragDelta event of the ResizeRight control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Controls.Primitives.DragDeltaEventArgs"/> instance containing the event data.</param>
private void ResizeRight_DragDelta(object sender, DragDeltaEventArgs e)
{
    if (ActualWidth + e.HorizontalChange < MinWidth)
        return;

    Width = ActualWidth + e.HorizontalChange;

    if (sender != null)
        Container.InvalidateSize();
}

/// <summary>
/// Handles the DragDelta event of the ResizeBottom control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Controls.Primitives.DragDeltaEventArgs"/> instance containing the event data.</param>
private void ResizeBottom_DragDelta(object sender, DragDeltaEventArgs e)
{
    if (ActualHeight + e.VerticalChange < MinHeight)
        return;

    Height = ActualHeight + e.VerticalChange;

    if (sender != null)
        Container.InvalidateSize();
}
于 2012-10-26T14:31:37.020 に答える
0

ウィンドウをスヌープし、ツリーを調べて値を確認してください

詮索

于 2012-10-21T09:52:38.757 に答える