Problems with binding to Window Height and Width

后端 未结 9 759
长发绾君心
长发绾君心 2020-12-05 13:46

I have some problems when I try to bind the height and width of a window to properties in my view model. Here is a small sample app to illustrate the problem. This is the co

相关标签:
9条回答
  • 2020-12-05 14:18

    Binding to MinWidth and MinHeight is correct. Also, if you need bind to MaxWidth and MaxHeight if your dynamic will both enlarge or reduce the size of Window.

    0 讨论(0)
  • 2020-12-05 14:19

    I am not sure about your specific implementation, but I just write an example that maybe could helpful.

    XAML

    <Window x:Name="MainWindow"
        x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" 
        MinWidth="200"
        MinHeight="100"
        Width="{Binding ElementName=MainWindow, Path=WindowWidth}"
        Height="{Binding ElementName=MainWindow, Path=WindowHeight}">
        <Grid>
            <Slider 
                x:Name="slWidth" 
                Value="{Binding ElementName=MainWindow, Path=WindowWidth, Mode=TwoWay}"
                Minimum="200"
                Maximum="1600"
                Height="23" HorizontalAlignment="Left" Margin="56,22,0,0" VerticalAlignment="Top" Width="61" />
            <Label 
                Content="Width" 
                Height="28" 
                HorizontalAlignment="Left" 
                Margin="12,22,0,0" 
                Name="Label1" 
                VerticalAlignment="Top" />
            <Slider 
                x:Name="slHeight" 
                Value="{Binding ElementName=MainWindow, Path=WindowHeight, Mode=TwoWay}"
                Minimum="100"
                Maximum="800"
                Height="23" HorizontalAlignment="Left"  VerticalAlignment="Top" Width="61" Margin="56,51,0,0" />
            <Label 
                Content="Height" 
                Height="28" 
                HorizontalAlignment="Left"              
                VerticalAlignment="Top" Margin="12,46,0,0" />
        </Grid>
    </Window>
    

    Code

    Class MainWindow
    
        Public Shared ReadOnly WindowWidthProperty As DependencyProperty = _
                               DependencyProperty.Register("WindowWidth", _
                               GetType(Integer), GetType(MainWindow), _
                               New FrameworkPropertyMetadata(Nothing))
    
        Public Shared ReadOnly WindowHeightProperty As DependencyProperty = _
                             DependencyProperty.Register("WindowHeight", _
                             GetType(Integer), GetType(MainWindow), _
                             New FrameworkPropertyMetadata(Nothing))
    
        Public Property WindowWidth As Integer
            Get
                Return CInt(GetValue(WindowWidthProperty))
            End Get
            Set(ByVal value As Integer)
                SetValue(WindowWidthProperty, value)
            End Set
        End Property
    
        Public Property WindowHeight As Integer
            Get
                Return CInt(GetValue(WindowHeightProperty))
            End Get
            Set(ByVal value As Integer)
                SetValue(WindowHeightProperty, value)
            End Set
        End Property
    
    
    End Class
    

    C# Code

    public readonly DependencyProperty WindowWidthProperty = DependencyProperty.Register("WindowWidth", typeof(Double), typeof(MainWindow), new FrameworkPropertyMetadata());
    public readonly DependencyProperty WindowHeightProperty = DependencyProperty.Register("WindowHeight", typeof(Double), typeof(MainWindow), new FrameworkPropertyMetadata());
    
    public double WindowWidth {
        get { return Convert.ToDouble(this.GetValue(WindowWidthProperty)); }
        set { this.SetValue(WindowWidthProperty, value); }
    }
    
    public double WindowHeight {
        get { return Convert.ToDouble(this.GetValue(WindowHeightProperty)); }
        set { this.SetValue(WindowHeightProperty, value); }
    }
    
    0 讨论(0)
  • 2020-12-05 14:21

    I have fixed this issue using the below code. I hope it can help someone.

    Important point: Dynamic binding in WPF always works only with property but not with a variable.

    Declare a global public property in .xaml.cs file like below:

    public Double DynamicHeight { get; set; }
    
    // Set DynamicHeight property value in Window_Loaded or any other event
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
         DynamicHeight = 200;
    }
    

    Set a dynamic height in .xaml file like below:

    <Grid Height="{Binding DynamicHeight, Mode=TwoWay}">
    </Grid>
    

    Please vote for this answer if you find it useful. Thanks!

    0 讨论(0)
  • 2020-12-05 14:24

    Additionally you can use SizeToContent="WidthAndHeight" with the MinHeight and MinWidth, so not extra call would require for the MaxHeight and MaxWidth.

    0 讨论(0)
  • 2020-12-05 14:26

    Try using two way binding, it worked for me:

    Width="{Binding Path=xExt, Mode=TwoWay}"
    
    0 讨论(0)
  • 2020-12-05 14:27
    Height="{DynamicResource {x:Static SystemParameters.PrimaryScreenHeightKey}}" Width="{DynamicResource {x:Static SystemParameters.PrimaryScreenWidthKey}}"
    

    Works fine on my end.

    0 讨论(0)
提交回复
热议问题