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

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

ただいまの
回答率

90.53%

  • C#

    8832questions

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

  • Visual Studio

    2296questions

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

  • WPF

    817questions

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

  • XAML

    286questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,561

deerhunter

score 1

前提・実現したいこと

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

該当のソースコード

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.IO;
using System.Xml;
using System.Xaml;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfPrintReportSample.Views
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void CalendarButton_Click(object sender, RoutedEventArgs e)
        {
            using (var sr = new StreamReader("Views/CalendarControl1.xaml"))
            {
                StackPanel Wkstart_stack = this.FindName("WkStartPanel") as StackPanel;
                Calendar Wkstart_cal = new WpfPrintReportSample.Views.;
                /// var Calxml = XmlReader.Create(sr.BaseStream);
                /// var ctrls =  as UIElement;
                Wkstart_stack.Children.Add("Views/CalendarControl1.xaml");
                /// var ctrls = XamlReader as UIElement;
                /// var item = new TabItem()
                {
                };
            }
        }
    }

MainWindow

<UserControl x:Class="WpfPrintReportSample.Reports.ReportSample"
             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:vm="clr-namespace:WpfPrintReportSample.ViewModels"
             mc:Ignorable="d"
             d:DesignHeight="1122.52" d:DesignWidth="793.70">
    <UserControl.DataContext>
        <vm:MainWindowViewModel />
    </UserControl.DataContext>
    <Grid>
        <TextBlock x:Name="WkStart_Copy" 
            FontSize="21.333" Margin="43,16,84,0"  FontFamily="HGSKyokashotai" IsEnabled="False" RenderTransformOrigin="0.5,0.5" 
            Foreground="Black" Height="34"  Padding="2.5,2.5,2.5,2" Text="サ ー ビ ス 報 告 書" HorizontalAlignment="Center" VerticalAlignment="Top" TextDecorations="Underline" />
        <StackPanel x:Name="CustomerStackP" HorizontalAlignment="Left" Height="245" Margin="10,80,0,0" VerticalAlignment="Top" Width="740" SnapsToDevicePixels="True">
            <TextBlock x:Name="WkStart" 
                FontSize="21.333" Margin="44,16,29,0"  FontFamily="HGSKyokashotai" IsEnabled="False" RenderTransformOrigin="0.5,0.5" 
                Foreground="Black" Height="34" VerticalAlignment="Top"  Padding="2.5,2.5,2.5,2"  Text="作業開始:                  平成29年01月25日" />
            <TextBlock x:Name="WkEnd" 
                FontSize="21.333" Margin="43,1,30,0"  FontFamily="HGSKyokashotai" IsEnabled="False" RenderTransformOrigin="0.5,0.5" 
                Foreground="Black" Height="34" VerticalAlignment="Top"  Padding="2.5,2.5,2.5,2"  Text="作業終了:                  平成29年01月25日" />
            <TextBlock x:Name="WkEnd_Copy" 
                FontSize="21.333" Margin="43,1,30,0"  FontFamily="HGSKyokashotai" IsEnabled="False" RenderTransformOrigin="0.5,0.5" 
                Foreground="Black" Height="34" VerticalAlignment="Top"  Padding="2.5,2.5,2.5,2"   Text="合計作業時間:                      時間" />
            <TextBlock x:Name="WkEnd_Copy1" 
                FontSize="21.333" Margin="43,1,30,0"  FontFamily="HGSKyokashotai" IsEnabled="False" RenderTransformOrigin="0.5,0.5" 
                Foreground="Black" Height="34" VerticalAlignment="Top"  Padding="2.5,2.5,2.5,2"   TextDecorations="Underline" Text="{Binding Text}" />
        </StackPanel>
        <Separator HorizontalAlignment="Left" Height="10" Margin="10,325,0,0" VerticalAlignment="Top" Width="755"/>
        <StackPanel Margin="10,340,-10,588">
            <TextBlock x:Name="sonson" 
                FontSize="21.333" Margin="43,16,30,0"  FontFamily="HGSKyokashotai" IsEnabled="False" RenderTransformOrigin="0.5,0.5" 
                Foreground="Black" Height="34" VerticalAlignment="Top"  Padding="2.5,2.5,2.5,2" FontStyle="Italic"   Text="作業開始:                  平成29年01月25日" />
        </StackPanel>
    </Grid>
</UserControl>

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

<!-- x:Class="WpfPrintReportSample.Views.CalendarControl1" -->
<UserControl 
             x:Class="WpfPrintReportSample.Views.CalendarControl1"
             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:local="clr-namespace:WpfPrintReportSample.Views"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid RenderTransformOrigin="0.5,0.5" Margin="-13,16,120,102">
        <Grid.RenderTransform>
            <TransformGroup>
                <ScaleTransform/>
                <SkewTransform/>
                <RotateTransform Angle="-14.781"/>
                <TranslateTransform/>
            </TransformGroup>
        </Grid.RenderTransform>
        <Calendar HorizontalAlignment="Left" VerticalAlignment="Top"/>

    </Grid>
</UserControl>

試したこと

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

補足情報(言語/FW/ツール等のバージョンなど)

Visual Studio Community 2015にて作成しています

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/14 08:08

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

    キャンセル

  • 2017/01/14 10:33

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

    キャンセル

  • 2017/01/15 04:51

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

    キャンセル

  • 2017/02/03 15:43

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

    キャンセル

同じタグがついた質問を見る

  • C#

    8832questions

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

  • Visual Studio

    2296questions

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

  • WPF

    817questions

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

  • XAML

    286questions

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