【问题标题】:WPF MVVM changing TextBox size as you typeWPF MVVM 在您键入时更改文本框大小
【发布时间】:2013-03-31 21:34:34
【问题描述】:

我有一个 TextBox,随着它的内容增长,我希望它增长,随着它的内容缩小,我希望它的高度和宽度都缩小。这可以通过挂钩到 TextBox 中的 TextChanged 事件来轻松实现,这意味着代码隐藏,我们应该在 MVVM 中避免这种情况。所以问题是我们如何在 MVVM 中做到这一点?我们显然必须使用 Commands(实现 ICommand 接口的类),同时我们不能将 Commands 挂钩到事件。

一种选择是使用 System.Windows.Interactivity。我以前用过它,它非常简洁,但实际上有些人可能反对它,因为它更多地使用 Silverlight 库。

还有其他选择吗?

更简单的 XAML。请注意,我希望窗口改变它的大小,因为 TextBox 占据了整个窗口:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid HorizontalAlignment="Stretch">
        <TextBox Width="Auto">            
        </TextBox>
    </Grid>
</Window>

这是我的 XAML:

<Window x:Class="SleekNoteUI.Views.SleekNoteView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    <Window.Template>
        <ControlTemplate>
            <Border...>
                <Grid>
                    <Grid Grid.Row="1" x:Name="noteGrid">
                        <TextBox Grid.Row="0"
                                 Text="{Binding SomeText...}"
                                 Background="{Binding...}">
            </TextBox>
        </Grid>
        </Grid>
    </Border>
    </ControlTemplate>
</Window.Template>
</Window>

【问题讨论】:

  • 1 - MVVM 并不是要避免代码落后。这是关于将 UI 从业务/应用程序逻辑和数据中分离出来。 2 - System.Windows.Interactivity 与 Silverlight 一样多的 WPF,所以我不知道“某些人”在说什么,但它的使用是完全有效的。

标签: c# .net wpf xaml mvvm


【解决方案1】:

文本框随着文本的变化而缩小/增长:

<TextBox HorizontalAlignment="Left" Width="Auto" MinWidth="10"/>
  • 仅限 XAML 的解决方案。
  • 后面没有代码,
  • 没有System.Windows.Interactivity
  • 不要将与尺寸相关的东西放入不属于它们的 ViewModel 中。

再说一遍:

  • MVVM 并不是要避免代码落后。这是关于将 UI 从业务/应用程序逻辑和数据中分离出来。
  • System.Windows.Interactivity 与 Silverlight 一样多的 WPF,所以我不知道“某些人”在说什么,但它的使用是完全有效的

【讨论】:

  • 如果我有一个独立的 TextBox,这将起作用,但我的 TextBox 在一个窗口内,或者更准确地说它在一个 DockPanel 内,即在一个网格内,它在一个窗口内。我有我的自定义窗口,其中包含一个 TextBox 和其他一些东西。另一种方法是使用数据绑定。而且我猜我应该引入新的依赖属性,并且随着它们的值的变化,相应地改变窗口的高度和宽度。然后在 ViewModel 中公开这些依赖项属性。我说得有道理吗,还是有其他方法?
  • @armanali 老兄,不要试图用语言解释整个事情,只需发布​​您当前的 XAML,以便我可以告诉您如何修复它。无论您的 TextBox 在哪里,我的解决方案仍然适用。
  • SizeToContent="WidthAndHeight" 完成这项工作。没有其他必要了。感谢 HighCore :)
【解决方案2】:

只需将 Width 属性设置为“Auto”即可。

<TextBox Width="Auto" />

谢谢, 拉梅什

【讨论】:

  • @Ramesh Width="Auto" 不能为框架元素设置
【解决方案3】:

使用 System.Windows.Interactivity 创建一个行为。这是封装代码的最佳方式,否则最终会出现在代码隐藏中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    相关资源
    最近更新 更多