[C# WPF] 多言語対応がうまくいかないのでハイパーリンクを自作した

.NETにはHyperlinkクラスがありますが、NavigateUriに設定するURLを言語ごとに切り替えようとStaticResourceを指定したところ実行時エラーになるので、それっぽくうごくボタンを作りました。

文章中の一部をハイパーリンクにする場合は別の方法になるので、単独で配置したいときの参考になるかもしれません。

スポンサーリンク

環境

  • Windows 10
  • Visual Studio 2022
  • .NET 6.0

機能

  • マウスオーバーすると色が変わって、アンダースコアが消えます
  • クリックすると既定のブラウザで設定したURLを開きます

コード

ソリューション構成とリソースはこんな感じです。

MainWindow.xaml

<Window x:Class="Sample_HyperlinkButton.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:properties="clr-namespace:Sample_HyperlinkButton.Properties"
        mc:Ignorable="d"
        Title="MainWindow" Height="250" Width="400"
        WindowStartupLocation="CenterOwner" ResizeMode="NoResize" ShowInTaskbar="False"
        >
    <Grid>
        <Button HorizontalAlignment="Center" VerticalAlignment="Center"
                HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
                Content="{x:Static properties:Resources.Caption}"
                Click="OnClick"
                >
            <Button.Style>
                <Style TargetType="Button">
                    <Setter Property="OverridesDefaultStyle" Value="True"/>
                    <Setter Property="Foreground" Value="Blue"/>
                    <Setter Property="TextBlock.TextDecorations" Value="Underline"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type Button}">
                                <TextBlock Name="TextBlock" TextDecorations="Underline" Text="{TemplateBinding Content}" Background="{TemplateBinding Background}"/>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <Setter TargetName="TextBlock" Property="TextBlock.TextDecorations" Value="{x:Null}"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Foreground" Value="Aqua"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>
    </Grid>
</Window>

MainWindow.xaml.cs

namespace Sample_HyperlinkButton
{
    using System.Windows;

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void OnClick(object sender, RoutedEventArgs e)
        {
            var startInfo = new System.Diagnostics.ProcessStartInfo(Properties.Resources.URL)
            {
                UseShellExecute = true
            };
            _ = System.Diagnostics.Process.Start(startInfo);
        }
    }
}

おしまい。

スポンサーリンク

.NET,C#,WPF.NET,C#,WPF

Posted by peliphilo