轉(zhuǎn)帖|其它|編輯:郝浩|2011-05-26 14:37:17.000|閱讀 3174 次
概述:最近寫一個(gè)簡(jiǎn)單的文本編輯器,自然少不了字體和顏色選擇功能,當(dāng)然,這里的字體和顏色僅限于簡(jiǎn)易的在ComboBox或其他類似列表性質(zhì)的選擇器,而不是那種Font/Color/Dialog/Picker控件。我們先來(lái)看系統(tǒng)字體選擇。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
最近寫一個(gè)簡(jiǎn)單的文本編輯器,自然少不了字體和顏色選擇功能,當(dāng)然,這里的字體和顏色僅限于簡(jiǎn)易的在ComboBox或其他類似列表性質(zhì)的選擇器,而不是那種Font/Color/Dialog/Picker控件。我們先來(lái)看系統(tǒng)字體選擇。
字體選擇
WPF中System.Windows.Media.Fonts類可以返回系統(tǒng)字體信息(包括FontFamily和Typeface),我們直接利用它接著定義Data Template就可以,不過注意以下幾點(diǎn):
ComboBox的ItemsPanel默認(rèn)是StackPanel而不是VirtualizingStackPanel,這樣在系統(tǒng)字體比較多的情況下,打開ComboBox會(huì)異常得慢,需要把它設(shè)置成VirtualizingStackPanel,性能會(huì)有很大提升。
ComboBox的IsSynchronizedWithCurrentItem為True,這樣下面的TextBlock綁定CollectionViewSource的當(dāng)前選項(xiàng)正是ComboBox的選擇項(xiàng).
結(jié)果預(yù)覽圖
<Window.Resources> <CollectionViewSource x:Key="sysFonts" Source="{x:Static Fonts.SystemFontFamilies}" /> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"></RowDefinition> <RowDefinition></RowDefinition> <RowDefinition Height="Auto"></RowDefinition> </Grid.RowDefinitions> <ComboBox Name="cbx" ItemsSource="{Binding Source={StaticResource sysFonts}}" IsSynchronizedWithCurrentItem="True" > <ComboBox.ItemsPanel> <ItemsPanelTemplate> <VirtualizingStackPanel></VirtualizingStackPanel> </ItemsPanelTemplate> </ComboBox.ItemsPanel> <ComboBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding}" FontFamily="{Binding}" FontSize="16"></TextBlock> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> <StackPanel Grid.Row="2" HorizontalAlignment="Center" > <TextBlock Text="預(yù)覽:"></TextBlock> <TextBlock Text="劉圓圓 123 Mgen" FontSize="20" FontFamily="{Binding Source={StaticResource sysFonts},Path=/}"> </TextBlock> </StackPanel> </Grid> |
顏色選擇
顏色選擇其實(shí)就可以預(yù)定義幾個(gè)顏色值,然后加在列表中,再加個(gè)“更多顏色”按鈕調(diào)用一些外部ColorPicker讓用戶選擇其他非預(yù)定義顏色。但總覺得這種方法不是很好,至少不自然,你還是需要自己去選顏色,終于有一天在Stackoverflow.com上看到了答案。地址是://stackoverflow.com/questions/562682/how-can-i-list-colors-in-wpf-with-xaml
解決方案就是那個(gè)問題的答案。
原理是利用Colors類(Brushes類也可以)的成員屬性名稱來(lái)枚舉顏色,用兩個(gè)ObjectDataProvider逐步調(diào)用Type.GetType和Type.GetProperties來(lái)得到Colors類的所有PropertyInfo。
不過原問題的答案是只顯示名稱,我們?cè)偕宰餍薷亩xData Template來(lái)顯示顏色,感謝WPF無(wú)所不在的TypeConverter,最后PropertyInfo.Name會(huì)被轉(zhuǎn)換成相應(yīng)的顏色。
運(yùn)行預(yù)覽圖:
<!-- 此代碼是在其他原始代碼上修改而成 --> <!-- 原始代碼://stackoverflow.com/questions/562682/how-can-i-list-colors-in-wpf-with-xaml --> <Window.Resources> <ObjectDataProvider MethodName="GetType" ObjectType="{x:Type sys:Type}" x:Key="colorsTypeOdp"> <ObjectDataProvider.MethodParameters> <sys:String>System.Windows.Media.Colors, PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</sys:String> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> <ObjectDataProvider ObjectInstance="{StaticResource colorsTypeOdp}" MethodName="GetProperties" x:Key="colorPropertiesOdp"> </ObjectDataProvider> </Window.Resources> <StackPanel> <ComboBox Name="comboBox1" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Source={StaticResource colorPropertiesOdp}}"> <ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <Rectangle Fill="{Binding Name}" Margin="1 3" Height="10" Width="100"></Rectangle> <TextBlock Text="{Binding Name}" Margin="2 0"></TextBlock> </StackPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> </StackPanel> |
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載