我正在創建一個 WPF UI,其中包含一個控制臺。為此,我想將 的一部分設定TextBox為只讀,但仍然能夠在最后輸入一些內容,TextBox也可以洗掉該部分。
是否可以只將 WPF 的一部分設為TextBox只讀,還是我需要處理一個事件并自己撰寫代碼?
uj5u.com熱心網友回復:
我認為默認 WPF 不可能做到這一點TextBox。但是,還有另一種方法可以以不同的方式實作類似控制臺的控制元件。創建一個ConsoleOutputtype 屬性,ObservableCollection<string>用于保存控制臺中顯示的文本ConsoleInput行和視圖模型中當前輸入行的屬性。不要忘記實作INotifyPropertyChanged,否則用戶界面不會對 的變化做出反應ConsoleInput。此外,創建一個 command RunCommand,當您在控制臺中確認或運行命令時將執行該命令。
public ObservableCollection<string> ConsoleOutput { get; }
private string _consoleInput;
public string ConsoleInput
{
get => _consoleInput;
set
{
if (value.Equals(_consoleInput))
return;
_consoleInput = value;
OnPropertyChanged();
}
}
public ICommand RunCommand { get; }
在建構式中初始化屬性,如下所示。的實作RunCommand只是將新確認的控制臺輸入行添加到控制臺輸出的集合中并清空輸入。
public YourViewModel()
{
//... other code.
ConsoleOutput = new ObservableCollection<string>();
OnPropertyChanged(nameof(ConsoleOutput));
RunCommand = new DelegateCommand(ExecuteRun);
OnPropertyChanged(nameof(RunCommand));
}
private void ExecuteRun()
{
ConsoleOutput.Add(ConsoleInput);
ConsoleInput = string.Empty;
}
然后創建控制元件并系結屬性。AScrollViewer確保,一旦控制臺輸出超過視窗,就會有一個滾動條。有一個ItemsControl顯示到目前為止所有的控制臺輸出和一個TextBox下面的輸入。它沒有邊界,因此不會突出。中的Enter鍵TextBox系結到RunCommand,這意味著將當前輸入添加到控制臺輸出并清除。
<ScrollViewer>
<StackPanel>
<ItemsControl ItemsSource="{Binding ConsoleOutput}" />
<TextBox BorderThickness="0" Text="{Binding ConsoleInput, UpdateSourceTrigger=PropertyChanged}">
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding RunCommand}"/>
</TextBox.InputBindings>
</TextBox>
</StackPanel>
</ScrollViewer>
這是輸出。最后一個元素是TextBox接受輸入直到您點擊Enter。

uj5u.com熱心網友回復:
是否可以只將 WPF 文本框的一部分設為只讀
回答您的問題:不,不可能TextBox使用任何內置功能僅將一部分設為只讀。
您必須以某種方式自己實作。也許你可以考慮使用幾個TextBox元素,其中只有最后一個是可編輯的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/376988.html
上一篇:WPFICommands系結
