<状況>
WPF(.NET Framwork)で下記のUIを作成中
・ボタンを押すと、ファイルOpenダイアログを表示し、ファイルを開く
↓
・開いたファイルはボタン横のテキストボックスにフルパスで表示する(後にこのフルパスを使う)
↓
・デザイン上、テキストボックスのサイズが小さいのでフルパスが表示しきれない
(パスの先頭から表示しており、ファイル名が見えない)
<やりたいこと>
・ユーザーにとって大事なのはファイル名なので、右詰めで表示し、先頭を省略したい
・あるいは、テキストボックスをクリックしたときに、全体を表示するようにしたい
・その他、別の方法、アプローチがあれば知りたい
<試したこと>
・HorizontalContentAlignmentをRightにしたが、省略されずにパスの先頭から表示してしまう
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
編集する(させる)気はない
<TextBox FlowDirection="RightToLeft" IsReadOnly="True"
簡便さや文字のコピーができる点は良い(個人的には短いテキストの時は、左に寄っていてほしいが^^;
コンテキストメニューも反転する(ので自前追加か?)
パスの真ん中を「...」のように省略するってのは割とよくあるが、コピーできないのでは(個人的には)使えないですね(すべて確認したわけではありません)
WPF PathTrimmingTextBlock - CodeProject
Search · PathTrimmingTextBlock
編集もしたい
RightToLeft
では左右キーが逆になるのがイヤすぎるので、この手は使えない。
コードビハインドでText
設定
(バカバカしいが)Text
設定時にスクロールさせる。
サイズ変更には連動しない(SizeChanged
で同様のことをすればいいが、個人的にはやりすぎかなと思う)
Text
にバインド
NotifyOnTargetUpdated
が必要(これ以外ユーザー入力とプログラムからの設定を、見分ける方法がない?)
TargetUpdated
をビヘイビアにするのは簡単なので、MVVM教の方も安心です。
クリックしたとき全体表示
Popup
を使えばいいのですが、(実際は別ウィンドウという都合上)非常に癖が強く扱いが難しいです。
見た目も操作性も上々ですが、スクリーンキーボードで入力できない(入力しようとすると閉じてしまう)のが個人的には激痛です(StaysOpen="True"
で自前管理することはできますが、私の納得いく挙動にするのはおそらく不可能)
これをビヘイビアにするのは、考慮事項が多すぎて相当難易度が高い(そもそもPopup
をどこに挟むかだけでも難しい...)
それ以外の方法
ToolTip
- パスとファイル名を別に表示
- デザインを考え直す^^;
xml
1<Window 2 x:Class="Qmyuauinf4ppigc.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Width="400" 6 SizeToContent="Height"> 7 <StackPanel> 8 <UniformGrid Margin="10" Rows="1"> 9 <Button Click="ShortButton_Click" Content="short text" /> 10 <Button Click="LongButton_Click" Content="long text" /> 11 </UniformGrid> 12 13 <GroupBox Margin="10" Header="RightToLeft"> 14 <TextBox FlowDirection="RightToLeft" Text="{Binding Text}" /> 15 </GroupBox> 16 17 <GroupBox Margin="10" Header="RightToLeft ReadOnly"> 18 <TextBox 19 FlowDirection="RightToLeft" 20 IsReadOnly="True" 21 Text="{Binding Text}" 22 ToolTip="{Binding Text, RelativeSource={RelativeSource Self}}"> 23 <!-- ContextMenuも逆になるので仕方がない。こだわる場合は↓参照 --> 24 <!-- [Add items to the Default Context Menu in WPF C# | The Devpit](http://the-devpit.net/serendipity/index.php?/archives/217-Add-items-to-the-Default-Context-Menu-in-WPF-C.html) --> 25 <TextBox.ContextMenu> 26 <ContextMenu FlowDirection="LeftToRight"> 27 <MenuItem Command="ApplicationCommands.Copy" /> 28 <MenuItem Command="ApplicationCommands.Cut" /> 29 <MenuItem Command="ApplicationCommands.Paste" /> 30 </ContextMenu> 31 </TextBox.ContextMenu> 32 </TextBox> 33 </GroupBox> 34 35 <GroupBox Margin="10" Header="Code Behind"> 36 <TextBox x:Name="textBox1" /> 37 </GroupBox> 38 39 <GroupBox Margin="10" Header="Binding"> 40 <TextBox 41 x:Name="textBox2" 42 TargetUpdated="OnTargetUpdated" 43 Text="{Binding Text, NotifyOnTargetUpdated=True}" /> 44 </GroupBox> 45 46 <GroupBox Margin="10" Header="Popup"> 47 <Grid> 48 <TextBox 49 x:Name="textBox" 50 PreviewMouseDown="TextBox_PreviewMouseDown" 51 Text="{Binding Text}" /> 52 <Popup 53 x:Name="popup" 54 Width="{Binding ActualWidth, ElementName=textBox}" 55 Opened="Popup_Opened" 56 Placement="Relative" 57 PlacementTarget="{Binding ElementName=textBox}" 58 StaysOpen="False"> 59 <TextBox 60 x:Name="popupInTextBox" 61 Text="{Binding Text, ElementName=textBox}" 62 TextWrapping="Wrap" /> 63 </Popup> 64 </Grid> 65 </GroupBox> 66 </StackPanel> 67</Window>
cs
1using System; 2using System.ComponentModel; 3using System.Runtime.CompilerServices; 4using System.Runtime.InteropServices; 5using System.Windows; 6using System.Windows.Controls.Primitives; 7using System.Windows.Data; 8using System.Windows.Input; 9using System.Windows.Interop; 10 11namespace Qmyuauinf4ppigc 12{ 13 public partial class MainWindow : Window, INotifyPropertyChanged 14 { 15 private const string shortText = @"C:\hoge.txt"; 16 private const string longText = @"C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\devenv.exe"; 17 18 public string Text { get => _Text; set => Set(ref _Text, value); } 19 private string _Text; 20 21 public MainWindow() 22 { 23 InitializeComponent(); 24 DataContext = this; 25 } 26 27 private void ShortButton_Click(object sender, RoutedEventArgs e) 28 { 29 // 連続して同じボタンを押すと変更通知が来ないのでダミーでクリアしているが 30 // 実用上はそういうことはほぼないだろうからしなくてよい 31 Text = ""; 32 Text = shortText; 33 34 // バカバカしいがわかりやすいとも言える?^^; 35 textBox1.Text = shortText; 36 textBox1.CaretIndex = textBox1.Text.Length; 37 textBox1.ScrollToHorizontalOffset(double.MaxValue); 38 } 39 private void LongButton_Click(object sender, RoutedEventArgs e) 40 { 41 Text = ""; 42 Text = longText; 43 44 textBox1.Text = longText; 45 textBox1.CaretIndex = textBox1.Text.Length; 46 textBox1.ScrollToHorizontalOffset(double.MaxValue); 47 } 48 49 private void OnTargetUpdated(object sender, DataTransferEventArgs args) 50 { 51 textBox2.CaretIndex = textBox2.Text.Length; 52 textBox2.ScrollToHorizontalOffset(double.MaxValue); 53 } 54 55 56 private void TextBox_PreviewMouseDown(object sender, MouseButtonEventArgs e) 57 { 58 popup.IsOpen = true; 59 popupInTextBox.Focus(); 60 } 61 62 [DllImport("USER32")] public static extern bool SetForegroundWindow(IntPtr hWnd); 63 private void Popup_Opened(object sender, System.EventArgs e) 64 { 65 if (sender is Popup popup) 66 { 67 // これをしないとIMEオンの時、画面左上に入力欄が出る 68 // [[Solved] Text box is not working in WPF Popup - CodeProject](https://www.codeproject.com/Questions/184429/Text-box-is-not-working-in-WPF-Popup) 69 var source = (HwndSource)PresentationSource.FromVisual(popup.Child); 70 SetForegroundWindow(source.Handle); 71 } 72 } 73 74 #region INotifyPropertyChanged 75 public event PropertyChangedEventHandler PropertyChanged; 76 protected void Set<T>(ref T storage, T value, [CallerMemberName] string propertyName = null) 77 { 78 if (Equals(storage, value)) return; 79 storage = value; 80 OnPropertyChanged(propertyName); 81 } 82 protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 83 #endregion 84 } 85}
投稿2022/04/27 13:36
編集2023/07/30 07:34総合スコア10091
0
ベストアンサー
このケースの場合はHorizontalContentAlignmentではなくFlowDirectionを設定します
XAML
1<TextBox FlowDirection="RightToLeft" Text="長い文字列" />
詳しくはWPF の双方向機能の概要
投稿2022/04/26 02:34
総合スコア71
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。