WPF binding Width to Parent.Width*0.3

后端 未结 2 1374
遇见更好的自我
遇见更好的自我 2020-12-30 11:23

I want to bind a control\'s Width to the parent\'s Width, but to a certain scale. Is there a way to do something like this:



        
相关标签:
2条回答
  • 2020-12-30 11:36

    I'd recommend simply doing this in XAML using a grid columns and the * width type:

    <Window x:Class="NameSpace.WindowName"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window1" Height="300" Width="300">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="2*" />
            </Grid.ColumnDefinitions>
    
            <Grid Grid.Column="0"></Grid><!--This item take up 1/3 of window width-->
            <Grid Grid.Column="1"></Grid> <!--This item take up remaining 2/3 of window width-->
    
        </Grid>
    </Window>
    

    You can change the ratio of how much the columns take up by changing the numbers before the * in the column widths. Here it's setup as 1 and 2, so the grid will be split in 3 (sum of all * widths), with 1/3 of width to first column and 2/3 to second column.

    0 讨论(0)
  • 2020-12-30 11:49

    Sure, but you will need to use a converter. Something like this one:

    using System;
    using System.Globalization;
    using System.Windows.Data;
    using System.Windows.Markup;
    
    namespace WpfTestBench.Converters
    {
        public class PercentageConverter : MarkupExtension, IValueConverter
        {
            private static PercentageConverter _instance;
    
            #region IValueConverter Members
    
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return System.Convert.ToDouble(value) * System.Convert.ToDouble(parameter);
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
    
            #endregion
    
            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                return _instance ?? (_instance = new PercentageConverter());
            }
        }
    }
    

    And your XAML will look like:

    <Window x:Class="WpfTestBench.ScaleSample"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:converters="clr-namespace:WpfTestBench.Converters"
            Title="Scale sample" Height="300" Width="300">
        <Grid Name="ParentGrid">
            <Rectangle
                Width="{Binding Path=ActualWidth, ElementName=ParentGrid, Converter={converters:PercentageConverter}, ConverterParameter='0.5'}"
                Stroke="Black" StrokeThickness="2" />
        </Grid>
    </Window>
    
    0 讨论(0)
提交回复
热议问题