【问题标题】:WPF binding IValueConverter and the width of another controlWPF 绑定 IValueConverter 和另一个控件的宽度
【发布时间】:2011-06-14 05:13:33
【问题描述】:

以下代码运行良好。代码的其他地方有错误。不过,给出的建议还是不错的。


我正在尝试将TextBoxWidth 绑定到父控件的Width 的百分比。我知道我可以通过简单地设置 Margin 来完成类似的事情,但我想知道为什么这不起作用。

首先,我在我的用户控件的资源集合中设置了对IValueConverter 的引用:

<UserControl.Resources>
    <local:TextBoxWidthConverter x:Key="txtWidthConv" />
</UserControl.Resources>

在主要的 xaml 中,我有以下内容:

<StackPanel Name="parentPanel" Width="300">
  <ScrollViewer HorizontalScrollBarVisibility="Auto"    
       VerticalScrollBarVisibility="Hidden" Name="scroller" Width="{Binding Width,    
       ElementName=parentPanel, Converter={StaticResource txtWidthConv}}">           
     <StackPanel Orientation="Horizontal">
       <TextBox></TextBox>
     </StackPanel>
   </ScrollViewer>
</StackPanel>

ivalueconverter 如下所示:

public class TextBoxWidthConverter : IValueConverter
{

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double result = (double)value;

        if (!Double.IsNaN(result))
        {
            result = result * .25;
        }
        else
        {
            result = 100D;
        }

        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new System.NotImplementedException("Not implemented.");
    }

    #endregion
}

在这里设置 width 属性没有任何作用,更不用说设置IValueConverter。我希望 ScrollViewer 是父级 StackPanel 宽度的 1/4。

【问题讨论】:

  • 我用静态设置的Width 尝试了你的 XAML,效果很好。
  • 这里也一样,在 VS2008 中尝试过,ScrollViewer 的大小是 ParentPanel 的 1/4 - 如果删除 TextBox 周围的 StackPanelTextBox 将扩大到ScrollViewer的大小?

标签: wpf binding width ivalueconverter


【解决方案1】:

让布局系统为您工作,而不是与之抗衡。 Grid 将自动处理相对大小:

<StackPanel Name="parentPanel" Width="300">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition />
      <ColumnDefinition Width="3*" />
    </Grid.ColumnDefinitions>

    <ScrollViewer HorizontalScrollBarVisibility="Auto"    
       VerticalScrollBarVisibility="Hidden" Name="scroller">           
      <StackPanel Orientation="Horizontal">
        <TextBox></TextBox>
      </StackPanel>
    </ScrollViewer>
  </Grid>
</StackPanel>

【讨论】:

  • 我知道如何解决布局问题。我想知道为什么绑定不起作用。我会再做一些测试。我认为我的项目一定很时髦。
  • 嗯,代码在 .NET 4 的 VS2010 中按预期工作,但在 .NET 3.5 的 VS2008 中却没有。
【解决方案2】:

将 ScrollViewer 的 HorizontalAlignment 设置为 Stretch 以外的其他值。

另外,您应该绑定到ActualWidth property

【讨论】:

  • 这似乎没什么区别。
  • @Bob:你试过ActualWidth吗?
  • 是:Width="{Binding ActualWidth, ElementName=parentPanel, Converter={StaticResource txtWidthConv}}"
  • 如果您手动将Width 设置为75,是否有效?它对我有用。
  • 我要做的是将宽度绑定到 parentPanel 的宽度并自动使其成为 .25 * 该宽度。
猜你喜欢
  • 2011-08-17
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 2012-06-15
相关资源
最近更新 更多