35711


WPFアプリでModern UI [リンクの説明をここに入力](https://github.com/firstfloorsoftware/mui)  
を使っています。  
ここでModernTab.Linksを使ってタブを選択すると表示する画面を切り替えています。  
[![画像の説明をここに入力](https://i.stack.imgur.com/RAGhV.png)](https://i.stack.imgur.com/RAGhV.png)

[code]

    <UserControl x:Class="FirstFloor.ModernUI.App.Content.LoremIpsumList"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:mui="http://firstfloorsoftware.com/ModernUI"
                 xmlns:app="clr-namespace:FirstFloor.ModernUI.App"
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
        <Grid>
            <mui:ModernTab SelectedSource="/2" Layout="List">
                <mui:ModernTab.Links>
                    <mui:Link DisplayName="Lorem Ipsum 1" Source="/1" />
                    <mui:Link DisplayName="Lorem Ipsum 2" Source="/2" />
                    <mui:Link DisplayName="Lorem Ipsum 3" Source="/3"/>
                    <mui:Link DisplayName="Lorem Ipsum 4" Source="/4" />
                    <mui:Link DisplayName="Lorem Ipsum 5" Source="/5"/>
                </mui:ModernTab.Links>
                
                <!-- ensures new LoremIpsum content is loaded for each uri -->
                <mui:ModernTab.ContentLoader>
                    <app:LoremIpsumLoader />
                </mui:ModernTab.ContentLoader>
            </mui:ModernTab>
        </Grid>
    </UserControl>
[/code]

**ここから質問なのですが、各LinksのSourceで指定したxamlを表示するときにxamlへデータを渡したいです。**  
例えばタブ名をやタブのIndex,タブのもつプロパティ値を右画面に表示されるxamlに表示させるようなイメージです。  
依存関係プロパティを使うのか、他のもっとよい方法があるのかご教授ください。


CC BY-SA 3.0
2017-06-17T05:54:41.107
35658
2017-06-20T01:29:55.017
12388
question
c# wpf xaml
ModernUIのModernTab.Linksでリンク先のページに情報を渡したい。


Modern UI for
WPFが規定で用意しているフレームワークとクラスをそのまま利用する場合、最もシンプルなのはSource属性に指定するUriに対してquery文字列を追加するアプローチになるかと思います。  
例えば、Twitterクライアントの各タイムラインをタブで実装して、同じTimeline.xamlで表示し、パラメーターとして表示対象を渡したい場合、

[code]

    <mui:ModernTab.Links>
        <mui:Link DisplayName="Timeline" Source="/Timeline.xaml?mode=timeline" />
        <mui:Link DisplayName="Mention" Source="/Tineline.xaml?mode=mention" />
        <mui:Link DisplayName="DM" Source="/Timeline.xaml?mode=dm&display=popup"/>
    </mui:ModernTab.Links>
    
[/code]

などと記述しておき、Timeline.xaml側ではIContentのOnNavigateToメソッドを実装してNavigationEventArgsのSourceプロパティをUriとして解読します。  
Uriクラスの各種プロパティが相対Uriには利用できないので正規表現でざっくり実装ですが、こんな感じで。

[code]

    public partial class Timeline : UserControl, IContent
    {
        public void OnFragmentNavigation(FirstFloor.ModernUI.Windows.Navigation.FragmentNavigationEventArgs e)
        {
        }
    
        public void OnNavigatedFrom(FirstFloor.ModernUI.Windows.Navigation.NavigationEventArgs e)
        {
        }
    
        public void OnNavigatedTo(FirstFloor.ModernUI.Windows.Navigation.NavigationEventArgs e)
        {
            var display = Regex.Match(e.Source.OriginalString, "[?&]+display=(?<display>[^&]+)").Groups["display"].Value;
            var mode = Regex.Match(e.Source.OriginalString, "[?&]+mode=(?<mode>[^&]+)").Groups["mode"].Value;
        }
    
        public void OnNavigatingFrom(FirstFloor.ModernUI.Windows.Navigation.NavigatingCancelEventArgs e)
        {
        }
    }
    
[/code]

Modern UI for WPFの既定のLinkクラスが本当に最低限なので、そのまま利用する一番素直なやり方としてはこんな感じになるか、と思います。  
文字列渡しになるので高度な受け渡しはできませんし、URL Encodingに注意する必要があります。  
あとは力づくでごりごりと継承するなり、ハッシュ値でも渡してみるなりやり方は色々か、と。


CC BY-SA 3.0
2017-06-19T08:16:58.283
35711
2017-06-19T08:16:58.283
2947
35658
answer