最近项目要采用 office 2007 Ribbon 菜单 Silverlight 中采用了divelements.SandRibbon 控件
但是不支持 HypterLinkButton 所以加了扩展属性
<UserControl 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" mc:Ignorable="d" xmlns:sr="clr-namespace:divelements.SandRibbon;assembly=divelements.SandRibbon" xmlns:divelements_SandRibbon_Primitives="clr-namespace:divelements.SandRibbon.Primitives;assembly=divelements.SandRibbon" xmlns:my="clr-namespace:Skybot.RibbonRun" xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" x:Class="Skybot.RibbonRun.MainPage" d:DesignWidth="640" d:DesignHeight="480"> <Grid x:Name="LayoutRoot"> <Grid.Resources> <Style x:Key="_hyperlink" targettype="HyperlinkButton"> <Setter Property="Foreground" Value="#FF15428B"/> </Style> </Grid.Resources> <Grid.RowDeFinitions> <RowDeFinition Height="0.302*"/> <RowDeFinition Height="0.698*"/> </Grid.RowDeFinitions> <sr:Ribbon ApplicationName="应用程序名" Title="Ribbon" d:LayoutOverrides="Width,Height" Margin="0,0.083" VerticalAlignment="Stretch"> <sr:Ribbon.ToolBar> <sr:QuickAccesstoolBar> <sr:Button Content="12121" Text="12121" ToolTipService.ToolTip="12121"/> </sr:QuickAccesstoolBar> </sr:Ribbon.ToolBar> <sr:RibbonTab Text="Insert"> <sr:RibbonGroup Header="Links" ShowDialogLauncher="False"> <sr:CollapsiblePanel > <sr:Button CollapsetoMedium="WhenGroupIsMedium" Size="Large" Text="Cross-reference" LargeImage="/Icons/32/copy.png" > <HyperlinkButton NavigateUri="/Views/DePage.xaml" Click="HyperlinkButton_Click" TargetName="main" Content="dePage"/> </sr:Button> <sr:Button CollapsetoMedium="WhenGroupIsMedium" my:RibbonHyperlinkButton.Target="main" my:RibbonHyperlinkButton.Href="/Views/DePage.xaml" MouseLeftButtonDown="Button_MouseLeftButtonDown" Activate="Button_Activate" LargeImage="Icons/32/copy.png" Size="Large" Text="1212121" Height="56" /> </sr:CollapsiblePanel> </sr:RibbonGroup> </sr:RibbonTab> </sr:Ribbon> <navigation:Frame x:Name="main" Margin="0,4,0" Grid.Row="1"/> </Grid> </UserControl>
用法
xmlns:my="clr-namespace:Skybot.RibbonRun" <sr:Button CollapsetoMedium="WhenGroupIsMedium" my:RibbonHyperlinkButton.Target="main" my:RibbonHyperlinkButton.Href="/Views/DePage.xaml" MouseLeftButtonDown="Button_MouseLeftButtonDown" Activate="Button_Activate" LargeImage="Icons/32/copy.png" Size="Large" Text="1212121" Height="56" />
源代码
using System; using System.Windows; using System.Windows.Controls; using divelements.SandRibbon; namespace Skybot.RibbonRun { /// <summary> /// 定義了 自己定義的 附加屬性 導航功能 /// 作者 Skybot /// 日期 2009-11 - 18 /// </summary> public class RibbonHyperlinkButton : HyperlinkButton { public RibbonHyperlinkButton():base() { } /// <summary> /// 查詢的方法 /// </summary> /// <param name="el">原素</param> /// <param name="panel">引用原素</param> private void FindPanertPanel(FrameworkElement el,ref Panel panel) { if (el is Panel) { panel = el as Panel; } else { FindPanertPanel(el.Parent as FrameworkElement,ref panel); } } /// <summary> /// 找到 沒有找到 反回 Null /// </summary> /// <param name="el">找到 上級原素 是 Panel 的對像</param> public virtual Panel FindPanertPanel(FrameworkElement el) { Panel panel =null; FindPanertPanel(el,ref panel); return panel; } /// <summary> /// 導航 /// </summary> public void Navigate() { base.OnClick(); } /// <summary> /// 值類型 只能內部訪問 /// </summary> protected class ValueClass { public Uri Uri { get; set; } private string _Target = "_self"; public string Target { get { return _Target; } set { _Target = value; } } /// <summary> /// 按鈕對像 /// </summary> public RibbonHyperlinkButton LinkButton { get;set; } } /// <summary> /// 提供 內部使用的對像 /// </summary> protected static readonly DependencyProperty ValueClassproperty = DependencyProperty.Registerattached("ValueClass",typeof(ValueClass),typeof(RibbonHyperlinkButton),null ); /// <summary> /// 可複用的附加 行為或屬性 /// 用於定義要轉到的URL /// </summary> public static readonly DependencyProperty HrefProperty = DependencyProperty.Registerattached("Href",typeof(Uri),new PropertyMetadata(null,new PropertyChangedCallback( //通过事件处理程序OnHoverChanged,当你在XAML中设置那个属性时,你可以提供一些应用程序逻辑: // http://it.hexun.com/2009-06-01/118200778.html (sender,e) => { ValueClass valobj = null; if ((sender as FrameworkElement).GetValue(ValueClassproperty) == null) { (sender as FrameworkElement).SetValue(ValueClassproperty,new ValueClass()); #region 初始化事件 將 LinkButton添加了UI頁面上不然不能導航 (sender as FrameworkElement).MouseLeftButtonDown += (sd,ev) => { //得到當前對像 RibbonHyperlinkButton link = ((sender as FrameworkElement).GetValue(ValueClassproperty) as ValueClass).LinkButton; ///對異常的處理 用於處理器 當添加一次以後再次添加會出現異常 try { //添加到Panel對像 link.FindPanertPanel(sender as FrameworkElement).Children.Add(link); } catch { } //轉到 link.Navigate(); }; //如果是 RibbonControl 控制項 if (sender is RibbonControl) { (sender as RibbonControl).Activate += (sd,ev) => { //得到當前對像 RibbonHyperlinkButton link = ((sender as FrameworkElement).GetValue(ValueClassproperty) as ValueClass).LinkButton; ///對異常的處理 用於處理器 當添加一次以後再次添加會出現異常 try { //添加到Panel對像 link.FindPanertPanel(sender as FrameworkElement).Children.Add(link); } catch { } //轉到 link.Navigate(); }; } #endregion } else { //重新設置類型值 valobj = (sender as FrameworkElement).GetValue(ValueClassproperty) as ValueClass; valobj.Uri = (Uri)e.NewValue; valobj.LinkButton = new RibbonHyperlinkButton() { NavigateUri = (Uri)(sender as FrameworkElement).GetValue(HrefProperty),TargetName = (string)(sender as FrameworkElement).GetValue(TargetProperty),Visibility = Visibility.Collapsed }; } }) )); public static readonly DependencyProperty TargetProperty = DependencyProperty.Registerattached("Target",typeof(string),new PropertyMetadata("_self",new PropertyChangedCallback( //通过事件处理程序OnHoverChanged,当你在XAML中设置那个属性时,你可以提供一些应用程序逻辑: // http://it.hexun.com/2009-06-01/118200778.html (sender,e) => { ValueClass valobj = null; if ((sender as FrameworkElement).GetValue(ValueClassproperty) == null) { (sender as FrameworkElement).SetValue(ValueClassproperty,new ValueClass()); #region 初始化事件 將 LinkButton添加了UI頁面上不然不能導航 (sender as FrameworkElement).MouseLeftButtonDown += (sd,ev) => { //得到當前對像 RibbonHyperlinkButton link = ((sender as FrameworkElement).GetValue(ValueClassproperty) as ValueClass).LinkButton; ///對異常的處理 用於處理器 當添加一次以後再次添加會出現異常 try { //添加到Panel對像 link.FindPanertPanel(sender as FrameworkElement).Children.Add(link); } catch { } //轉到 link.Navigate(); }; //如果是 RibbonControl 控制項 if (sender is RibbonControl) { (sender as RibbonControl).Activate += (sd,ev) => { //得到當前對像 RibbonHyperlinkButton link = ((sender as FrameworkElement).GetValue(ValueClassproperty) as ValueClass).LinkButton; ///對異常的處理 用於處理器 當添加一次以後再次添加會出現異常 try { //添加到Panel對像 link.FindPanertPanel(sender as FrameworkElement).Children.Add(link); } catch { } //轉到 link.Navigate(); }; } #endregion } else { //重新設置類型值 valobj = (sender as FrameworkElement).GetValue(ValueClassproperty) as ValueClass; valobj.Target = (string)e.NewValue; valobj.LinkButton = new RibbonHyperlinkButton() { NavigateUri = (Uri)(sender as FrameworkElement).GetValue(HrefProperty),Visibility = Visibility.Collapsed }; } } ) )); /// <summary> /// 提供擴展方法 /// </summary> /// <param name="frameworkElement"></param> /// <param name="value"></param> public static Uri GetHref(FrameworkElement frameworkElement) { if (frameworkElement == null) { throw new ArgumentNullException("沒有傳入frameworkElement 原素"); } return (Uri)frameworkElement.GetValue(HrefProperty); } /// <summary> /// 提供擴展方法 /// </summary> /// <param name="frameworkElement"></param> /// <param name="value"></param> public static void SetHref(FrameworkElement frameworkElement,Uri value) { if (frameworkElement == null) { throw new ArgumentNullException("沒有傳入frameworkElement 原素"); } frameworkElement.SetValue(HrefProperty,value); } /// <summary> /// 提供擴展方法 /// </summary> /// <param name="frameworkElement"></param> /// <param name="value"></param> public static string GetTarget(FrameworkElement frameworkElement) { if (frameworkElement == null) { throw new ArgumentNullException("沒有傳入frameworkElement 原素"); } return (string)frameworkElement.GetValue(TargetProperty); } /// <summary> /// 提供擴展方法 /// </summary> /// <param name="frameworkElement"></param> /// <param name="value"></param> public static void SetTarget(FrameworkElement frameworkElement,string value) { if (frameworkElement == null) { throw new ArgumentNullException("沒有傳入frameworkElement 原素"); } frameworkElement.SetValue(TargetProperty,value); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。