質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

8605閲覧

WPFによる動的にコントロールの生成

deerhunter

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2017/01/13 10:30

###前提・実現したいこと
WPFとC#で、機械メンテナンス日報用のアプリケーションを作っています。ボタンをクリックすることで予めxamlとして用意しておいたカレンダーを動的に表示させたいのですが、どうしても出来ません。
表示させたいのはツールボックスで定義してある標準のCalendarで、作業日時の入力を簡単にするために実装を考えています。
また、デザイナで確認したいので、動的にコントロール内容を生成するのは自分自身で禁止しています。試行錯誤で、色々なコードが混じっていますが、よろしくお願い致します。

###該当のソースコード
MainWindow.xaml.cs

cs

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.Windows; 7using System.IO; 8using System.Xml; 9using System.Xaml; 10using System.Windows.Controls; 11using System.Windows.Data; 12using System.Windows.Documents; 13using System.Windows.Input; 14using System.Windows.Media; 15using System.Windows.Media.Imaging; 16using System.Windows.Navigation; 17using System.Windows.Shapes; 18 19namespace WpfPrintReportSample.Views 20{ 21 /// <summary> 22 /// MainWindow.xaml の相互作用ロジック 23 /// </summary> 24 public partial class MainWindow : Window 25 { 26 public MainWindow() 27 { 28 InitializeComponent(); 29 } 30 31 private void CalendarButton_Click(object sender, RoutedEventArgs e) 32 { 33 using (var sr = new StreamReader("Views/CalendarControl1.xaml")) 34 { 35 StackPanel Wkstart_stack = this.FindName("WkStartPanel") as StackPanel; 36 Calendar Wkstart_cal = new WpfPrintReportSample.Views.; 37 /// var Calxml = XmlReader.Create(sr.BaseStream); 38 /// var ctrls = as UIElement; 39 Wkstart_stack.Children.Add("Views/CalendarControl1.xaml"); 40 /// var ctrls = XamlReader as UIElement; 41 /// var item = new TabItem() 42 { 43 }; 44 } 45 } 46 }

MainWindow

xaml

1<UserControl x:Class="WpfPrintReportSample.Reports.ReportSample" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:vm="clr-namespace:WpfPrintReportSample.ViewModels" 7 mc:Ignorable="d" 8 d:DesignHeight="1122.52" d:DesignWidth="793.70"> 9 <UserControl.DataContext> 10 <vm:MainWindowViewModel /> 11 </UserControl.DataContext> 12 <Grid> 13 <TextBlock x:Name="WkStart_Copy" 14 FontSize="21.333" Margin="43,16,84,0" FontFamily="HGSKyokashotai" IsEnabled="False" RenderTransformOrigin="0.5,0.5" 15 Foreground="Black" Height="34" Padding="2.5,2.5,2.5,2" Text="サ ー ビ ス 報 告 書" HorizontalAlignment="Center" VerticalAlignment="Top" TextDecorations="Underline" /> 16 <StackPanel x:Name="CustomerStackP" HorizontalAlignment="Left" Height="245" Margin="10,80,0,0" VerticalAlignment="Top" Width="740" SnapsToDevicePixels="True"> 17 <TextBlock x:Name="WkStart" 18 FontSize="21.333" Margin="44,16,29,0" FontFamily="HGSKyokashotai" IsEnabled="False" RenderTransformOrigin="0.5,0.5" 19 Foreground="Black" Height="34" VerticalAlignment="Top" Padding="2.5,2.5,2.5,2" Text="作業開始: 平成29年01月25日" /> 20 <TextBlock x:Name="WkEnd" 21 FontSize="21.333" Margin="43,1,30,0" FontFamily="HGSKyokashotai" IsEnabled="False" RenderTransformOrigin="0.5,0.5" 22 Foreground="Black" Height="34" VerticalAlignment="Top" Padding="2.5,2.5,2.5,2" Text="作業終了: 平成29年01月25日" /> 23 <TextBlock x:Name="WkEnd_Copy" 24 FontSize="21.333" Margin="43,1,30,0" FontFamily="HGSKyokashotai" IsEnabled="False" RenderTransformOrigin="0.5,0.5" 25 Foreground="Black" Height="34" VerticalAlignment="Top" Padding="2.5,2.5,2.5,2" Text="合計作業時間: 時間" /> 26 <TextBlock x:Name="WkEnd_Copy1" 27 FontSize="21.333" Margin="43,1,30,0" FontFamily="HGSKyokashotai" IsEnabled="False" RenderTransformOrigin="0.5,0.5" 28 Foreground="Black" Height="34" VerticalAlignment="Top" Padding="2.5,2.5,2.5,2" TextDecorations="Underline" Text="{Binding Text}" /> 29 </StackPanel> 30 <Separator HorizontalAlignment="Left" Height="10" Margin="10,325,0,0" VerticalAlignment="Top" Width="755"/> 31 <StackPanel Margin="10,340,-10,588"> 32 <TextBlock x:Name="sonson" 33 FontSize="21.333" Margin="43,16,30,0" FontFamily="HGSKyokashotai" IsEnabled="False" RenderTransformOrigin="0.5,0.5" 34 Foreground="Black" Height="34" VerticalAlignment="Top" Padding="2.5,2.5,2.5,2" FontStyle="Italic" Text="作業開始: 平成29年01月25日" /> 35 </StackPanel> 36 </Grid> 37</UserControl> 38

カレンダーコントロールのソース

xaml

1<!-- x:Class="WpfPrintReportSample.Views.CalendarControl1" --> 2<UserControl 3 x:Class="WpfPrintReportSample.Views.CalendarControl1" 4 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 5 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 6 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 7 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 8 xmlns:local="clr-namespace:WpfPrintReportSample.Views" 9 mc:Ignorable="d" 10 d:DesignHeight="300" d:DesignWidth="300"> 11 <Grid RenderTransformOrigin="0.5,0.5" Margin="-13,16,120,102"> 12 <Grid.RenderTransform> 13 <TransformGroup> 14 <ScaleTransform/> 15 <SkewTransform/> 16 <RotateTransform Angle="-14.781"/> 17 <TranslateTransform/> 18 </TransformGroup> 19 </Grid.RenderTransform> 20 <Calendar HorizontalAlignment="Left" VerticalAlignment="Top"/> 21 22 </Grid> 23</UserControl>

###試したこと
以下のページを参考にしました。
動的にXAMLを表示する。
XMLの読み出し(XmlReader)
WPF 動的パネルは結構便利

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio Community 2015にて作成しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

表示のON/OFF程度なら Visibilityの変更で十分。はじめ、隠しておいて、イベントで表示させるようにすればいい。
動的にコントロールの生成は、この程度では使いません。

ついでなので、おそらくポップアップで表示させたいとかそういうものだと思われるので、サンプルコードを載せておきます。

<ToggleButton Name="ToggleButton"> </ToggleButton> <Popup IsOpen="{Binding ElementName=ToggleButton,Path=IsChecked}" StaysOpen="False" PlacementTarget="{Binding ElementName=ToggleButton }"> <Calendar /> </Popup> コード

投稿2017/01/13 10:38

編集2017/01/13 10:54
kiichi54321

総合スコア1984

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

deerhunter

2017/01/13 23:08

はじめまして。 ご回答ありがとうございます。表示/非表示で解決は目からうろこです。動的コントロールにこだわりすぎていた感じがあります。 ただ、WPFでの動的にコントロールに興味があり、上記のプログラムを書き始めたのは事実でありますので、頂いたサンプルコードを使って色々と試してみようと思います。 取り急ぎ、ご連絡まで。 deerhunter
deerhunter

2017/01/14 01:33

kiichi54321さん ありがとうございます。 サンプルコードを試したところ、今回の目的に沿ったものが作れそうです。 ご教授ありがとうございます。 調べていると、動的コントロールの生成についてはExpression Blenderが、導入の敷居が低いように思いました。Blenderの生成するコードと自分のやりたいことを突き合わせてみて、WPFにおける動的表現の理解につなげhttps://teratail.com/questions/61902#ていきたいと思います。
kiichi54321

2017/01/14 19:51

XamlServices.Load をつかうと、XAMLをC#のオブジェクトに変換できるので、目的を達成できると思います。 でも、これは、ほとんど使うことないのですよ。 それよりも、MVVMパターンをちゃんと学んだ方がいいと思います。
deerhunter

2017/02/03 06:43

kiichi54321さん、ありがとうございます。 後日、もう少し学びが進み、Prismを使ってある程度書けています。VMからVのユーザーコントロールの有効/無効化。DelegateCommandによる、VからのVMのメソッド呼び出し。Vに入力されたカレンダーの値をDependency Injectionで[Required(ErrorMessage = "...")]などでの検証など。 カレンダーについては、Wpf Toolkitという拡張機能に、DatePickerというものがあるのを見つけ、使っています。車輪の再発明をしていました。探すことは大事ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問