回答:
スクロールビューアで囲みます。
<ScrollViewer>
<TextBlock />
</ScrollViewer>
注:この回答はTextBlock
、元の質問で要求された(読み取り専用のテキスト要素)に適用されます。
TextBox
(編集可能なテキスト要素)にスクロールバーを表示する場合は、ScrollViewer
添付プロパティを使用します。
<TextBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Auto" />
これら二つの特性のための有効な値はDisabled
、Auto
、Hidden
とVisible
。
TextBlock
ないTextBox
です。
今は以下を使用できます:
<TextBox Name="myTextBox"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.CanContentScroll="True">SOME TEXT
</TextBox>
TextBlock
しないTextBox
(タイトル及び開口線のように)が、2番目の段落で言及しましたTextBox
。明確にするために、この答えは間違いなくテキストボックスに最適なアプローチであり、私のものはテキストブロックに最適です:)
より良いものは:
<Grid Width="Your-specified-value" >
<ScrollViewer>
<TextBlock Width="Auto" TextWrapping="Wrap" />
</ScrollViewer>
</Grid>
これにより、グリッドを使用しない場合のように、テキストブロック内のテキストがオーバーフローせず、テキストブロックの下の要素と重なることがなくなります。テキストブロックがすでに他の要素のグリッドにあるにもかかわらず、他の解決策を試したとき、それは私に起こりました。テキストブロックの幅はAutoである必要があり、Grid要素で希望の幅を指定する必要があることに注意してください。私は自分のコードでこれを行い、それは美しく動作します。HTH。
<ScrollViewer Height="239" VerticalScrollBarVisibility="Auto">
<TextBox AcceptsReturn="True" TextWrapping="Wrap" LineHeight="10" />
</ScrollViewer>
これは、XAMLでスクロールTextBoxを使用してテキスト領域として使用する方法です。
TextBlock
ないに関連していTextBox
ます。
この回答では、MVVMを使用したソリューションについて説明します。
このソリューションは、ログボックスをウィンドウに追加する場合に最適です。ログボックスは、新しいログメッセージが追加されるたびに下部に自動的にスクロールします。
これらの添付プロパティを追加すると、どこでも再利用できるため、非常にモジュール化された再利用可能なソフトウェアになります。
このXAMLを追加します。
<TextBox IsReadOnly="True"
Foreground="Gainsboro"
FontSize="13"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.CanContentScroll="True"
attachedBehaviors:TextBoxApppendBehaviors.AppendText="{Binding LogBoxViewModel.AttachedPropertyAppend}"
attachedBehaviors:TextBoxClearBehavior.TextBoxClear="{Binding LogBoxViewModel.AttachedPropertyClear}"
TextWrapping="Wrap">
この添付プロパティを追加します。
public static class TextBoxApppendBehaviors
{
#region AppendText Attached Property
public static readonly DependencyProperty AppendTextProperty =
DependencyProperty.RegisterAttached(
"AppendText",
typeof (string),
typeof (TextBoxApppendBehaviors),
new UIPropertyMetadata(null, OnAppendTextChanged));
public static string GetAppendText(TextBox textBox)
{
return (string)textBox.GetValue(AppendTextProperty);
}
public static void SetAppendText(
TextBox textBox,
string value)
{
textBox.SetValue(AppendTextProperty, value);
}
private static void OnAppendTextChanged(
DependencyObject d,
DependencyPropertyChangedEventArgs args)
{
if (args.NewValue == null)
{
return;
}
string toAppend = args.NewValue.ToString();
if (toAppend == "")
{
return;
}
TextBox textBox = d as TextBox;
textBox?.AppendText(toAppend);
textBox?.ScrollToEnd();
}
#endregion
}
そして、この添付プロパティ(ボックスをクリアするため):
public static class TextBoxClearBehavior
{
public static readonly DependencyProperty TextBoxClearProperty =
DependencyProperty.RegisterAttached(
"TextBoxClear",
typeof(bool),
typeof(TextBoxClearBehavior),
new UIPropertyMetadata(false, OnTextBoxClearPropertyChanged));
public static bool GetTextBoxClear(DependencyObject obj)
{
return (bool)obj.GetValue(TextBoxClearProperty);
}
public static void SetTextBoxClear(DependencyObject obj, bool value)
{
obj.SetValue(TextBoxClearProperty, value);
}
private static void OnTextBoxClearPropertyChanged(
DependencyObject d,
DependencyPropertyChangedEventArgs args)
{
if ((bool)args.NewValue == false)
{
return;
}
var textBox = (TextBox)d;
textBox?.Clear();
}
}
次に、MEFなどの依存関係注入フレームワークを使用している場合は、ロギング固有のすべてのコードを独自のViewModelに配置できます。
public interface ILogBoxViewModel
{
void CmdAppend(string toAppend);
void CmdClear();
bool AttachedPropertyClear { get; set; }
string AttachedPropertyAppend { get; set; }
}
[Export(typeof(ILogBoxViewModel))]
public class LogBoxViewModel : ILogBoxViewModel, INotifyPropertyChanged
{
private readonly ILog _log = LogManager.GetLogger<LogBoxViewModel>();
private bool _attachedPropertyClear;
private string _attachedPropertyAppend;
public void CmdAppend(string toAppend)
{
string toLog = $"{DateTime.Now:HH:mm:ss} - {toAppend}\n";
// Attached properties only fire on a change. This means it will still work if we publish the same message twice.
AttachedPropertyAppend = "";
AttachedPropertyAppend = toLog;
_log.Info($"Appended to log box: {toAppend}.");
}
public void CmdClear()
{
AttachedPropertyClear = false;
AttachedPropertyClear = true;
_log.Info($"Cleared the GUI log box.");
}
public bool AttachedPropertyClear
{
get { return _attachedPropertyClear; }
set { _attachedPropertyClear = value; OnPropertyChanged(); }
}
public string AttachedPropertyAppend
{
get { return _attachedPropertyAppend; }
set { _attachedPropertyAppend = value; OnPropertyChanged(); }
}
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
仕組みは次のとおりです。
<ScrollViewer MaxHeight="50"
Width="Auto"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto">
<TextBlock Text="{Binding Path=}"
Style="{StaticResource TextStyle_Data}"
TextWrapping="Wrap" />
</ScrollViewer>
MaxHeightをScrollViewerに配置することで、別の方法でこれを行っています。
MaxHeightを調整して、表示するテキストの行数を増減します。簡単です。
使用できます
ScrollViewer.HorizontalScrollBarVisibility="Visible"
ScrollViewer.VerticalScrollBarVisibility="Visible"
これらはwpfの添付プロパティです。詳細については
http://wpfbugs.blogspot.in/2014/02/wpf-layout-controls-scrollviewer.html
私はこれらの提案をテキストブロックで機能するようにしようとしましたが、機能しませんでした。私はそれをデザイナーから機能させることさえ試みました。(レイアウトを見て、一番下にある下向き矢印「V」をクリックしてリストを展開)私はScrollViewerの設定しようとした目に見えるし、その後オート、それはまだ動作しません。
最終的にはあきらめ、Readonly属性を設定したTextBlock
をaに変更しました。TextBox
他の誰かがこの問題を持っていますが、私を包む場合はいけない知っているTextBlock
にScrollViewer
単純な私は交換することを考え出した回避策として-私のUIを台無しsomewhow TextBlock
によってTextBox
、この1のように
<TextBox Name="textBlock" SelectionBrush="Transparent" Cursor="Arrow" IsReadOnly="True" Text="My Text" VerticalScrollBarVisibility="Auto">
は、スクロールバーを備えたのTextBox
ように見え、動作するを作成しTextBlock
ます(デザイナですべて実行できます)。
TextBlock
をTextBox
もう一度読んだとき、私はあなたが2回と1回言及したことに気づきました。