2011-07-28 4 views
5

आवश्यकताएँ:कैसे WPF में एक रैपिंग बटन बनाने के लिए

  • एक या दो पंक्तियों पर ही MinWidth संपत्ति
  • पाठ प्रदर्शित कर सकते हैं का समर्थन करना चाहिए। 3 या उससे अधिक तक लपेट नहीं सकते हैं।
  • बटन के रूप में संभव के रूप में छोटे MinWidth
  • का सम्मान करते हुए
  • केवल पाठ रिक्त स्थान
  • पर लपेट चौड़ाई निर्दिष्ट नहीं कर सकते कर सकते हैं बनाना चाहिए। बटन क्षैतिज बढ़ते रहना चाहिए।

यहाँ है मैं की तरह लग रहे करने के लिए बटन चाहते हैं क्या

enter image description here

मैं कैसे पाठ बनाने के लिए पर विचारों के लिए देख रहा हूँ (स्टाइल पर ध्यान न दें कृपया, रैपिंग महत्वपूर्ण हिस्सा है) गतिशील रूप से लपेटो।

उत्तर

1

चूंकि आपने टेक्स्ट को दो पंक्तियों तक सीमित कर दिया है, तो मेरा सुझाव एक कस्टम पैनल को बटन सामग्री के रूप में लिखना होगा जो निर्दिष्ट टेक्स्ट, फ़ॉन्ट इत्यादि को एक WPF स्वरूपित टेक्स्ट ऑब्जेक्ट में बदल देता है। इसके बाद आप इसे माप सकते हैं और तय कर सकते हैं कि आप इसे लेजर और मेजरऑवर्राइड और ArrangeOverride में कैसे प्रदर्शित करना चाहते हैं। FormattedText में एक प्रदर्शित करने के लिए एक पैरामीटर भी है ... संक्षेप में यदि पाठ फिट नहीं है। इसे दो पंक्तियों में रखने के लिए, आप इसे पहले बनाना चाहते हैं, फिर ऊंचाई के लिए एक पंक्ति क्या है यह देखने के लिए इसकी ऊंचाई जांचें। (टिप्पणियों में आराम जोड़ने की आवश्यकता है क्योंकि StackOverflow त्रुटियों को फेंक रहा है)।

+0

इसके बाद आप अपने MaxTextWidth बटन चौड़ाई के लिए सेट कर सकते हैं, तो ft.Height फिर से जाँच करें। यदि यह मूल ऊंचाई 2x से अधिक है, तो आपके पास 2 से अधिक लाइनें हैं और मैक्सहेइट को मूल ऊंचाई के बारे में 2x पर सेट करना चाहते हैं। –

+0

मैं इसे एक शॉट दूंगा और आपको बताऊंगा कि यह कैसे काम करता है। विचार के लिए धन्यवाद! –

+0

मैंने लगभग इस सटीक चीज़ को इसके साथ किया है, इसलिए यदि यह आपके लिए काम नहीं करता है तो मुझे बताएं। मुझे सिर्फ टिप्पणियों में पोस्ट करना होगा क्योंकि एसओ आज त्रुटियों को फेंक रहा है जब मैं कुछ भी कम पोस्ट करता हूं। –

2

मैं संपादन Button के लिए डिफ़ॉल्ट टेम्पलेट, मुख्य रूप से एक रैपिंग जोड़ने TextBlock डिफ़ॉल्ट ContentPresenter के बजाय द्वारा इस लक्ष्य को हासिल करने और एक कनवर्टर में अपनी Width गणना करने के लिए कोशिश की। इस दृष्टिकोण को कनवर्टर में काफी अधिक डेटा की आवश्यकता है, हालांकि प्रोबैली आसान है (और बेहतर :) ऐसा करने के तरीके लेकिन यह वैसे भी काम कर रहा है। यह डिफ़ॉल्ट टेम्पलेट में PresentationFramework.Aero करने के लिए ButtonChrome की वजह से एक संदर्भ की जरूरत है

बस एक StackPanel

में इस

<Button Style="{StaticResource WrappingButton}" 
     MinWidth="100" 
     Content="This button has some long text"> 
</Button> 

enter image description here
स्क्रीनशॉट नमूना की तरह उपयोग 3 WrappingButtons साथ

रैपिंगबटन शैली

<Style x:Key="WrappingButton" TargetType="{x:Type Button}" 
     xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"> 
    <Setter Property="HorizontalAlignment" Value="Left"/> 
    <Setter Property="Width" Value="Auto"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <ControlTemplate.Resources> 
        <local:WrappingButtonWidthConverter x:Key="WrappingButtonWidthConverter"/> 
       </ControlTemplate.Resources> 
       <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" RenderDefaulted="{TemplateBinding IsDefaulted}" SnapsToDevicePixels="true"> 
        <TextBlock VerticalAlignment="Center" 
           FontSize="{TemplateBinding FontSize}" 
           FontFamily="{TemplateBinding FontFamily}" 
           FontStyle="{TemplateBinding FontStyle}" 
           FontWeight="{TemplateBinding FontWeight}" 
           FontStretch="{TemplateBinding FontStretch}" 
           LineStackingStrategy="BlockLineHeight" 
           TextWrapping="Wrap" 
           TextTrimming="WordEllipsis" 
           Text="{Binding RelativeSource={RelativeSource TemplatedParent}, 
               Path=Content}"> 
         <TextBlock.Width> 
          <MultiBinding Converter="{StaticResource WrappingButtonWidthConverter}"> 
           <Binding RelativeSource="{RelativeSource Self}" Path="Text"/> 
           <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="FontFamily"/> 
           <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="FontStyle"/> 
           <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="FontWeight"/> 
           <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="FontStretch"/> 
           <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="FontSize"/> 
           <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="MinWidth"/> 
          </MultiBinding> 
         </TextBlock.Width> 
        </TextBlock> 
       </Microsoft_Windows_Themes:ButtonChrome> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsKeyboardFocused" Value="true"> 
         <Setter Property="RenderDefaulted" TargetName="Chrome" Value="true"/> 
        </Trigger> 
        <Trigger Property="ToggleButton.IsChecked" Value="true"> 
         <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="false"> 
         <Setter Property="Foreground" Value="#ADADAD"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

WrappingButtonWidthConverter

public class WrappingButtonWidthConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string text = values[0].ToString(); 
     FontFamily fontFamily = values[1] as FontFamily; 
     FontStyle fontStyle = (FontStyle)values[2]; 
     FontWeight fontWeight = (FontWeight)values[3]; 
     FontStretch fontStretch = (FontStretch)values[4]; 
     double fontSize = (double)values[5]; 
     double minWidth = (double)values[6]; 

     string[] words = text.Split(new char[] {' '}); 
     double widthSum = 0.0; 
     List<double> wordWidths = GetWordWidths(words, fontFamily, fontStyle, fontWeight, fontStretch, fontSize, out widthSum); 

     double width = 0.0; 
     for (int i = 0; width < (widthSum/2.0) && i < wordWidths.Count; i++) 
     { 
      width += wordWidths[i]; 
     } 

     return minWidth > 0.0 ? Math.Max(minWidth, width) : width; 
    } 
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    private List<double> GetWordWidths(string[] words, 
             FontFamily fontFamily, 
             FontStyle fontStyle, 
             FontWeight fontWeight, 
             FontStretch fontStretch, 
             double fontSize, 
             out double widthSum) 
    { 
     List<double> wordWidths = new List<double>(); 
     widthSum = 0.0; 
     foreach (string word in words) 
     { 
      Typeface myTypeface = new Typeface(fontFamily, fontStyle, fontWeight, fontStretch); 
      FormattedText ft = new FormattedText(word + " ", 
               CultureInfo.CurrentCulture, 
               FlowDirection.LeftToRight, 
               myTypeface, 
               fontSize, 
               Brushes.Black); 
      wordWidths.Add(ft.WidthIncludingTrailingWhitespace); 
      widthSum += ft.WidthIncludingTrailingWhitespace; 
     } 
     return wordWidths; 
    } 
} 
0

अपने बटन के सामग्री के रूप में एक RichTextBox का उपयोग करें:

  RichTextBox rtb = new RichTextBox(); 
      rtb.IsReadOnly = true; 
      rtb.Focusable = false; 
      rtb.BorderThickness = new Thickness(0); 
      rtb.Background = Brushes.Transparent; 
      rtb.AppendText("This button has some long text."); 
      myButton.Content = rtb; 
1

http://wpf.2000things.com/2011/07/11/339-wrapping-a-buttons-text-content-to-multiple-lines/

इस

यह मेरे लिए किया गया।इसके अलावा इस:

<Window.Resources> 
     <local:Questions x:Key="theQs"/> 
     <Style x:Key="WrappingButton" TargetType="{x:Type Button}"> 
      <Setter Property="FontSize" Value="10"> 

      </Setter> 
     </Style> 
    </Window.Resources> 

और इस:

<Button Name="btnDef4" Grid.Row="3" Style="{StaticResource WrappingButton}" > 
       <TextBlock Text="{Binding ElementName=LVQuestions, Path=SelectedItem.TheDefs[3].Deftext}" 
       TextWrapping="Wrap"/> 
      </Button> 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^