【问题标题】:How can I force the TextBox to display what is being entered into it?如何强制 TextBox 显示正在输入的内容?
【发布时间】:2021-03-17 01:25:51
【问题描述】:

在我的 UWP 应用程序中,我在单击按钮 (btnCre8NewMap) 时调用 ContentDialog。这是相关的 XAML:

<Button x:Name="btnCre8NewMap" Content="Create New Map" ToolTipService.ToolTip="Create a new map" Margin="140,16,50,0" VerticalAlignment="Top" Click="btnCre8NewMap_Click"/>
. . .
<ContentDialog x:Name="cntDlgCre8Map"
Title="Create a New Map"
PrimaryButtonText="Save"
CloseButtonText="Cancel"
DefaultButton="Primary">
    <StackPanel>
    <TextBlock Text="Map Name: "/>
    <TextBox x:Name="txtbxMapName"
        Width="300" HorizontalAlignment="Left"/>
    <TextBlock Text="Default Zoom Level: "/>
    <ComboBox x:Name="cmbxCre8MapZoomLevels"
        Width="100" HorizontalAlignment="Left"/>
    <TextBlock Text="Map Notes: "/>
    <TextBox x:Name="txtbxMapNotes"
        Width="300" Height="300" HorizontalAlignment="Left"/>
    </StackPanel>
</ContentDialog>

...这是代码隐藏中的按钮单击事件:

private async void btnCre8NewMap_Click(object sender, RoutedEventArgs e)
{
    try
    {
        string mapName = string.Empty;
        string mapNotes = string.Empty;
        int defaultZoomLevel = 1;
        ClearLocations();
        // Popul8 the cmbx
        for (int i = 1; i < 20; i++)
        {
            cmbxCre8MapZoomLevels.Items.Add(i.ToString());
        }
        ContentDialogResult result = await cntDlgCre8Map.ShowAsync();

        if (result == ContentDialogResult.Primary)
        {    
            mapName = txtbxMapName.Text;
            mapNotes = txtbxMapNotes.Text;
            defaultZoomLevel = cmbxCre8MapZoomLevels.SelectedIndex + 1;
            InsertMapRecord(mapName, mapNotes, preferredZoomLevel);
        }
        // else do nothing (don't save)
    }
    catch (Exception ex)
    {
        MessageDialog exceptionMsgDlg = new MessageDialog(ex.Message, "btnCre8NewMap_Click");
        await exceptionMsgDlg.ShowAsync();
    }
}

这是我点击按钮时看到的,在txtbxMapName中输入“bla”,然后在txtbxMapNotes中输入一堆文字:

问题是,虽然 txtbxMapName 允许我输入一个值(屏幕截图中的“bla”),但 txtbxMapNotes 在我输入文本时什么也没有显示(注意中间的“x”)。一旦我退出 txtbxMapNotes 控件,我输入的内容最终会显示出来,但是...?!?

我需要做什么才能让 txtbxMapNotes 在输入时显示正在输入的内容(不仅仅是在离开控件之后)?

【问题讨论】:

    标签: textbox winrt-xaml uwp-xaml contentdialog


    【解决方案1】:

    您可以在此处使用data-binding 在顶部TextBox 中键入时显示文本框中的文本。

    像这样更改 ContentDialog Xaml:

      <StackPanel>
                <TextBlock Text="Map Name: "/>
                <TextBox x:Name="txtbxMapName" Width="300" HorizontalAlignment="Left" Text="{Binding InputString,Mode= TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                <TextBlock Text="Default Zoom Level: "/>
                <ComboBox x:Name="cmbxCre8MapZoomLevels" Width="100" HorizontalAlignment="Left"/>
                <TextBlock Text="Map Notes: "/>
                <TextBox x:Name="txtbxMapNotes" Width="300" Height="300" HorizontalAlignment="Left" Text="{Binding InputString, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
            </StackPanel>
    

    在后面的代码中,创建一个名为 ViewModel 的新类:

     public class ViewModel: INotifyPropertyChanged 
    {
        private string _inputString;
    
        public string InputString
        {
            get { return _inputString; }
            set
            {
                _inputString = value;
                RaisePropertyChanged("InputString");
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected void RaisePropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
    }
    

    在代码隐藏中:

     public ViewModel viewModel { get; set; }
        public MainPage()
        {
            this.InitializeComponent();
    
            viewModel = new ViewModel();
    
            this.DataContext = viewModel;
        }
    

    我使用 MainPage 进行测试。您可以将代码添加到应用中的真实页面。

    您可能对INotifyPropertyChanged interfaceBinding markup extension 感到困惑。 请参阅这些文档以获取有关数据绑定的更多信息:Data binding overviewData binding in depth

    更新:

    将 TextWrapping="Wrap" 添加到 TextBox 以使清除所有按钮不可见。 像这样:

    <TextBox x:Name="txtbxMapNotes" Width="300" Height="300" TextWrapping="Wrap" HorizontalAlignment="Left" Text="{Binding InputString, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
    

    【讨论】:

    • 谢谢,罗伊;但是为什么一个 TextBox 可以正常工作,而另一个不能呢?唯一明显的区别是第二个有一个特定的高度......
    • @B.ClayShannon 你能告诉我你在做什么,而另一个不能正常工作吗?当您在顶部文本框中键入文本时,相同的文本将显示在底部文本框中。你的意思是干净的按钮覆盖了文本?
    • 是的,正如我的问题中提到的,当我在输入时输入较低/较大(较高)的文本框时,什么都没有显示,并且中间显示一个“x”。什么是“清洁按钮”?
    • 抱歉打错了,它是“清除按钮”。它用于删除 TextBox 中的所有文本。使其不可见的一种非常简单的方法是您可以在 xaml.xml 中设置TextWrapping="Wrap"。我也更新了我的答案,你可以检查一下。
    猜你喜欢
    • 2015-09-18
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多