2016-07-27 3 views
1

Могу ли я применить различные стили к содержимому кнопки? Например, у меня есть окно поиска, если пользователь вводит «находится» в поле поиска и нажимает «Поиск», могу ли я сделать два «есть» ниже в тексте курсора курсивом? В то же время я хочу сохранить оставшуюся часть, как она есть, без курсива.Как применять различные стили в абзаце?

<Button 
    Content="This is an example of button content. This is a very long content."> 
    <Button.Style> 
    ??? 
    </Button.Style> 
</Button> 

После применения стиля я хочу содержание кнопки: Это является пример содержимого кнопки. Это очень длинные сроки.

Возможно ли это?

ответ

1

Если содержание было статичным, вы можете просто определить свою кнопку так:

<Button> 
    <TextBlock> 
     <Run Text="This"></Run> 
     <Run Text="is" FontStyle="Italic"></Run> 
     <Run Text="an example of button content. This"></Run> 
     <Run Text="is" FontStyle="Italic"></Run> 
     <Run Text="a very long content."></Run> 
    </TextBlock> 
</Button> 

или:

<Button> 
    <RichTextBox IsReadOnly="True" BorderThickness="0"> <!-- Other styles as needed --> 
     <FlowDocument> 
      <Paragraph> 
       This 
       <Italic>is</Italic> an example of button content. This 
       <Italic>is</Italic> a very long content. 
      </Paragraph> 
     </FlowDocument> 
    </RichTextBox> 
</Button> 

Однако, для ситуации, когда стили являются динамичными, я бы использовать следующие службы:

// Note: Not my code, but I can't find the original source 
public static class RichTextBoxService 
{ 
    public static string GetContent(DependencyObject obj) 
    { 
     return (string)obj.GetValue(ContentProperty); 
    } 

    public static void SetContent(DependencyObject obj, string value) 
    { 
     obj.SetValue(ContentProperty, value); 
    } 

    public static readonly DependencyProperty ContentProperty = 
     DependencyProperty.RegisterAttached("Content", 
     typeof(string), 
     typeof(RichTextBoxHelper), 
     new FrameworkPropertyMetadata 
     { 
      BindsTwoWayByDefault = true, 
      PropertyChangedCallback = OnDocumentChanged, 
     }); 

    private static void OnDocumentChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     var richTextBox = (RichTextBox)obj; 

     // Parse the XAML content to a document (or use XamlReader.Parse()) 
     var xaml = GetContent(richTextBox); 
     var doc = new FlowDocument(); 
     var range = new TextRange(doc.ContentStart, doc.ContentEnd); 

     range.Load(new MemoryStream(Encoding.UTF8.GetBytes(xaml)), DataFormats.Xaml); 

     richTextBox.Document = doc; 

     // When the document changes update the source 
     range.Changed += (s, args) => 
     { 
      if (richTextBox.Document == doc) 
      { 
       MemoryStream buffer = new MemoryStream(); 
       range.Save(buffer, DataFormats.Xaml); 

       SetContent(richTextBox, Encoding.UTF8.GetString(buffer.ToArray())); 
      } 
     }; 
    } 
} 

Тогда вы будете использовать его с кнопкой, как так:

Вид:

<Window xmlns:services="clr-namespace:MyProject.Services;assembly=MyProject"> 

    <Button> 
     <RichTextBox IsReadOnly="True" BorderThickness="0" services:RichTextBoxService.Content="{Binding ButtonContent}" /> 
    </Button> 

ViewModel:

// Note: I can't remember is Section is required or not 
private const string Header = @"<Section xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""><Paragraph>"; 

private const string DefaultContent = "This is an example of button content. This is a very long content"; 

private const string Footer = "</Paragraph></Section>"; 

private string _search; 
public string Search 
{ 
    get { return _search; } 
    set { 
     if (Set(ref _search, value)) // using MVVMLight 
     { 
      // search value was updated 
      this.ButtonContent = Header + DefaultContent.Replace(value, "<Italic>" + value + "</Italic>") + Footer; 
     } 
    } 
} 
+0

Прохладный !! Я попробую это! Спасибо огромное! – spspli

+0

Сообщите мне, если есть какие-либо ошибки. Я сделал несколько изменений в коде, который я использую, и не тестировал его компиляцию. – Pakman

+0

Вы когда-нибудь пробовали более стильные стили на курсивной части? Знаете ли вы, могу ли я применить любой стиль, который я хотел бы использовать для этой ценности? Или просто простой стиль, как шрифт и т. Д.? DefaultContent.Заменить (значение, «» + значение + «») – spspli

1

Content может быть любым, например. a TextBlock, содержащий Run на слово или текстовый сегмент, который затем можно стилизовать индивидуально. Я не думаю, что здесь очень полезен чистый подход XAML. Если что-нибудь, что вы, возможно, захотите определить свой стиль выделения в ресурсах где-нибудь, тогда примените этот стиль условно в коде при вводе пользователя.

+0

Как применить стиль условно в коде на входе пользователя? Можете ли вы рассказать об этом больше или у вас есть пример, чтобы я мог ссылаться? – spspli

+0

Это просто означает присвоение свойства 'Style', если выполнено какое-либо условие, например. 'if (run.Text.Contains (" the ")) run.Style = italicStyle'. –

0

Я бы просто определить свою кнопку, как показано ниже:

   <Button.Content> 
       <TextBlock> 
        <Run Text="This" /> 
        <Run Text="is" FontStyle="{Binding Converter={StaticResource ItalicConverter}}" /> 
        <Run Text="a..." /> 
       </TextBlock> 
      </Button.Content> 

И тогда я хотел бы использовать ValueConverter для проверьте, нажал ли пользователь другой или не изменить стиль.

Что-то вроде этого:

public class ItalicConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return "Italic"; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return true; 
     } 
    } 

Вы должны добавить логику, чтобы преобразовать его обратно в нормальный

+0

Спасибо за ваш ответ. На самом деле контент динамический, а контент поиска также динамический. Но все равно спасибо! – spspli

Смежные вопросы