LoginSignup
0
0

More than 1 year has passed since last update.

WPF ButtonのContentsを改行させたいけどさせたくない

Last updated at Posted at 2021-07-05

WPF Buttonをクリックした時にそのButtonのContentsをクリップボードに保存するコードを書いてました。
用途としては雛形の一覧みたいなのをページに列挙して、クリックする事でその雛形を取得するみたいな。わざわざButtonを使ってるのは、マウスオーバーで選択されてる箇所がはっきり判るからなんですが、Buttonをこんな使い方していいのかはちょっと判りません。背徳感ちょっとありますね。

xmal
<Button Content="文字列" Click="Button_Click" />
code
private void Button_Click(object sender, RoutedEventArgs e)
{
    String tagString = ((TextBlock)((Button)sender).Content).Text;
    Clipboard.SetText(tagString);
}

みたいな感じの奴です。
ところがContents(コピーしたい文字列)が物凄く長くなってButtonの横幅がページに収まりきらなくなってしまったので、Contentsを改行したくなりました。

「WPF Button 改行」でGoogleって見ると,xamlでButtonタグに「xml:space="preserve"」を追記し、Contentsプロパティで改行個所に改行コード(&#10;など)を追記してやるとええぞという事が判りました。
早速xamlを変更です。

xmal
<Button Content="文字列&#10;の続き" Click="Button_Click" xml:space="preserve"/>

実際のContentは文章なので非常に長いですが上記のような感じです。こうすることでButton表示時に文字列が改行されるのでページ幅からはみ出さないようにボタンを配置できました。

しかしです、このまま上記codeでButtonのContentsをクリップボードにコピーすると、コピーした文字列も改行されてしまいます。これは困る(´・ω・`)

という訳でcodeの方も以下のように変更してみました。

code
private void Button_Click(object sender, RoutedEventArgs e)
{
    String tagString = ((TextBlock)((Button)sender).Content).Text;
    tagString = tagString.replace("&#10;", "");
    Clipboard.SetText(tagString);
}

replaceで &#10;を空文字列に置き換えようという作戦だったのですが、これが全然機能しない。エスケープ文字を削除する方法が全然判んないわけ。これはGoogleっても全然それらしい方法が見つかりませんでした。

ここでplanBです。先程ButtonのContentsを改行する方法を検索した際に、TextBlock設定する方法もあったのでそっちで試してみます。こっちはButtonの幅に応じて自動改行してくれるのでエスケープ文字を追加する必要がないから改行なしの文字列を取得できるはず……

xmal
<Button Click="Button_Click" xml:space="preserve" Width="xxx">
    <TextBlock Text="文字列&#10;の続き" TextWrapping="WrapWithOverflow" />
</Button>

※実際のTextはもっと長いのでButtonのWidthで改行されます。

実際にxamlを書き換えた所意図通りの表示となりました。
しかし、予想されていましたがこのまま当該のButtonをクリックするとエラーとなります。そりゃそう。((Button)sender).ContentはTextBlockオブジェクトなんだからそのままstringに変換できるわけがない。
なんかうまい方法があるのかもしれないのですが、頭が悪いのでエラーが出たらtry..catchで処理すりゃええじゃん、とcodeを以下のように変更しました。

code
private void Button_Click(object sender, RoutedEventArgs e)
{
    string tagString;

    try
    {
        tagString = (string)((Button)sender).Content;
    }
    catch
    {
        tagString = ((TextBlock)((Button)sender).Content).Text;
    }

    Clipboard.SetText(tagString);
}

取りあえず意図通りに動作しているのでオッケーです(´^ω^`)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0