Можно использовать Кнопку с шаблоном пользовательского элемента управления, код ниже является ограниченной кнопкой стиля гиперссылки (например, это только поддерживает текстовые гиперссылки), но возможно это укажет на Вас в правильном направлении.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<Style x:Key="Link" TargetType="Button">
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Foreground" Value="Blue"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<TextBlock TextDecorations="Underline"
Text="{TemplateBinding Content}"
Background="{TemplateBinding Background}"/>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Foreground" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
<Button Content="Click Me!" Style="{StaticResource Link}"/>
</Page>
Указатели символов, определенные с помощью значения инициализации, переходят в сегмент только для чтения. Чтобы сделать их модифицируемыми, вам нужно либо создать их в куче (например, с помощью new / malloc), либо определить их как массив.
Невозможно изменить:
char * foo = "abc";
Изменяемый:
char foo[] = "abc";
Строковые литералы не могут быть изменены; лучше предположить, что это не так. См. здесь для получения дополнительной информации.
Вы должны выработать привычку сопоставлять тип переменная с типом инициализатора. В этом случае:
const char* test = "abcdefghijklmnopqrstuvwxyz";
Таким образом вы получите ошибку компилятора, а не ошибку времени выполнения. Повышение уровня предупреждений компилятора до максимального также может помочь избежать таких ошибок. Почему это не ошибка C, вероятно, исторически; ранние компиляторы допускали это, а запрет на это могло привести к нарушению слишком большого количества существующего кода, когда язык был стандартизирован. Однако сейчас операционные системы не позволяют этого, так что это академично.
Do:
char * bar = strdup(foo);
bar[5] = 'x';
strdup
создает модифицируемую копию.
И да, вам действительно стоит проверить, что strdup
не возвращает NULL.