Quantcast
Channel: Windows Presentation Foundation ( WPF ) フォーラム
Viewing all 711 articles
Browse latest View live

DataGridComboBoxColumnのスタイル定義について

$
0
0

お世話になっております。

WPFのスタイル定義でまた詰まってしまったので質問をさせてください。

DataGridでDataGridComboBoxColumnを使用しているのですが、外出しテーマ用xamlにてDataGridComboBoxColumnのComboboxスタイル定義ができず困っております。

”DataGridComboBoxColumnの型は、FrameworkElementまたはFrameworkContentElementから派生している必要があります”という警告文が表示され、スタイルを設定することができません。

DataGridComboBoxColumnを使用している際に特にComboBoxのキーを指定せずスタイルを反映させたいのですが、テーマファイルにてDataGridComboBoxのスタイル定義を行うことは可能なのでしょうか。

ご教示頂けますと大変助かります。

宜しくお願い致します。


MVVMを使用した場合のモーダルダイアログの表示とModelの参照の渡し方について

$
0
0

.NET Framework 4.0、WPF4を使用してWPFアプリケーションをMVVMにしたがって作成しようとしています。

(MVVMを補佐するフレームワークの使用も検討しており、Livetを採用しようかと考えています)

下図のような処理、クラス設計を考えているのですが、いくつか質問があります。


Window1からWindow2を表示するための処理はどこに記述するのが良いのでしょうか?
調べている感じでは所論あるようなのですが、下記のような流れで良いのでしょうか?

  1. Window1のボタンを押すことでコマンドを発行
  2. 発行されたコマンドをViewModel1が受け取り、Modelの処理を呼び出す
  3. ModelはWindow2を表示することを判断、メッセージを発行
  4. ViewModel1はメッセージを受けてWindow2を表示(ShowDialogを呼ぶ)

(メッセージに関して理解が曖昧です・・・)


Window2のViewModelであるViewModel2のインスタンス化はWindows2が行うのが良いのでしょうか?
この場合、Window2が表示されるたびにViewModel2のインスタンス化が行われると思います。


ViewModel2へModelの参照を渡すにはどのようにすれば良いのでしょうか?

できれば、簡単なサンプルコードを提示していただけると助かります。

回答よろしくお願いします。

IValueConverterクラスで表示する画像の切り替えについて

$
0
0

こんにちは。
表題のとおり、「IValueConverterクラスで表示する画像の切り替えについて」教えてほしいです。

コンバータークラスで、整数型のデータから画像を表示するプログラムを作成しました。
この整数値は、比較される整数値が更新されたときに表示する画像を変更したいと考えています。
具体的には、以下のようになっています。

	public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var image = null as BitmapImage;

            var record = value as SampleRecord;
            if (record == null) return null;

            if (SelectedNoManager.Instance.SelectedNo == record.No)
            {
                image = new BitmapImage(new Uri(@"pack://application:,,,/Assets/arrow.png", UriKind.Absolute));
            }
            else
            {
                image = new BitmapImage(new Uri(@"pack://application:,,,/Assets/wait.png", UriKind.Absolute));
            }

            return image;
        }

切り替えするnoの値は、ユーザーの操作によっていくつかのウィンドウで再設定される可能性がありました。
そのためSingletonなクラスで保持することにしました。

private static readonly SelectedNoManager _Instance = new SelectedNoManager();

        /// <summary>
        /// インスタンスを取得します。
        /// </summary>
        public static SelectedNoManager Instance
        {
            get { return _Instance; }
        }

        private int _SelectedNo = 1;

        /// <summary>
        /// 選択している番号を取得または設定します。
        /// </summary>
        public int SelectedNo
        {
            get { return _SelectedNo; }
            set
            {
                _SelectedNo = value;
                RaisePropertyChanged(this, "SelectedNo");
            }
        }

サンプルではウィンドウのボタンを押下して、SelectedNoを1から2に切り替えています。
しかし、ウィンドウの画像が更新されません。こういうときはどのようにして切り替えすることができるのでしょうか。


サンプルのプログラム
http://1drv.ms/1x2xG3N

以上です。わかるかたいましたら、教えてほしいです。よろしくお願いします。

以下メインウィンドウのコード

public event PropertyChangedEventHandler PropertyChanged;


        private ObservableCollection<SampleRecord> _SampleRecords = new ObservableCollection<SampleRecord>
        {
            new SampleRecord{ No = 1, Name = "太郎A", Args = "おまけ1" },
            new SampleRecord{ No = 2, Name = "太郎B", Args = "おまけ2" },
            new SampleRecord{ No = 3, Name = "太郎C", Args = "おまけ3" },
            new SampleRecord{ No = 4, Name = "太郎D", Args = "おまけ4" },
            new SampleRecord{ No = 5, Name = "太郎E", Args = "おまけ5" },
            new SampleRecord{ No = 6, Name = "太郎F", Args = "おまけ6" },
            new SampleRecord{ No = 7, Name = "太郎G", Args = "おまけ7" },
            new SampleRecord{ No = 8, Name = "太郎H", Args = "おまけ8" },
        };


        /// <summary>
        /// サンプルで作成したデータグリッドのデータコレクションを取得または設定します。
        /// </summary>
        public ObservableCollection<SampleRecord> SampleRecords
        {
            get { return _SampleRecords; }
            set
            {
                _SampleRecords = value;
                RaisePropertyChanged(this, "SampleRecords");
            }
        }


        public MainWindow()
        {
            InitializeComponent();

            // init
            this.DataContext = this;
        }


        /// <summary>
        /// <seealso cref="System.ComponentModel.INotifyPropertyChanged.PropertyChanged"/> イベントを発生させます。
        /// </summary>
        /// <param name="sender">イベントを発生させる元になるオブジェクト。</param>
        /// <param name="propertyNames">変化が発生したプロパティ名のテキスト。</param>
        public void RaisePropertyChanged(object sender, params string[] propertyNames)
        {
            if (PropertyChanged == null) return;

            foreach (var name in propertyNames)
            {
                PropertyChanged(sender, new PropertyChangedEventArgs(name));
            }
        }


        /// <summary>
        /// ボタンを押下したとき、選択しているNoを変更するためのイベントです。
        /// </summary>
        /// <param name="sender">未使用。</param>
        /// <param name="e">未使用。</param>
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            SelectedNoManager.Instance.SelectedNo = 2;
            RaisePropertyChanged(this, "SampleRecords"); // 更新されない
        }


DatePickerの多言語対応

$
0
0

VisualStudio2013 .Net 4.5.1 C# WPF でアプリを作成しています。

DatePickerを使用した場合、日付を選択するウィンドウ内の文字(年、月、曜日)の文字を多言語対応させたいと考えています。

また、アプリを再起動せずに言語を切替えたいと考えています。

例えば、下記のようにコードビハインドでLanguageを指定しています。

  CultureInfo newCulture = new CultureInfo("en-US");
  datepicker.Language = XmlLanguage.GetLanguage(newCulture.Name);
この場合、切り替わる事は切り替わるのですが、日付を選択するウィンドウを開いた時点では前の言語で表示されており、前月又は次月へ移動すると、ようやく指定した言語で文言が切り替わります。

日付を選択するウィンドウを開いた時に、言語が切り替わって欲しいのですが、何か実装が足りないのでしょうか。

WPFをMVVMで使用した場合のバインド内容の変換について

$
0
0

WPFをMVVMに則ってバインドを多用してアプリケーションを作成しようとしています。

環境は下記のとおりです。

  • WPF 4.0
  • Visual Studio 2013
  • MVVMフレームワークLivetを使用検討中

若干WPFから離れてMVVMの概念的な話になるのかもしれないのですが・・・

Model側で状態を示すenum(あるいはboolなど、なんでも構いません)を持ち、それをデータバインディングを用いてWindow(View)に表示する場合に、
「モデル内ではこういう管理方法ではあるけど、View上での表示自体は別であって欲しい」という要求であった場合、
「Model内の表現をViewで見せたい形に変更する処理」はModel, ViewModel, Viewのどこが担うものなのでしょうか?

要素的には見せ方、つまりデザインに近いものなのでViewが担うのが妥当のように感じるのですが、データバインディングされている要素をView側で変換することができるのでしょうか?

簡単なサンプルコードなどを紹介していただけると助かります。

回答よろしくお願いします。

ItemsControl が生成したコンテナの中のコントロールに直接アクセスしたい

$
0
0

.NET Framework 4.5
Visual Studio 2013 Pro
WPF + C# で開発しています。

次のように ItemsControl によって TextBox コントロールを並べることを考えます。

<ItemsControl ItemsSource="{Binding Source}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><local:CustomPanel /></ItemsPanelTemplate></ItemsControl.ItemsPanel><ItemsControl.ItemTemplate><DataTemplate><TextBox Text="{Binding .}" /></DataTemplate></ItemsControl.ItemTemplate></ItemsControl>

ただしアイテムを並べるパネルには自作の CustomPanel を指定します。

このとき、CustomPanel 内で
各 TextBox コントロールにアクセスするにはどのようにすればよいでしょうか。
次のようなコードで試してみましたが、
ContentPresenter に包まれてしまうようで、
TextBox コントロールとして扱うことができませんでした。

foreach (UIElement item in this.InternalChildren)
{
    // 何か処理
}

ASP.NET WEBAPI + WPFアプリケーションのクライアント側のデータの扱いについて

$
0
0

初心者です。
ASP.NET WEBAPI + WPFアプリケーションのシステム構築を考えております。
 経験としては、WINDOWSフォームアプリケーション開発の経験のみです。
今回、サーバーにDBを置き、サーバー側にASP.NET WebAPIを配置、REST通信(JSON)を行おうとしております。
上記は、問題なく確認できました。(Fiddlerで確認)

しかし、クライアント側をどのようにつくるのか大変困っております。
WPFアプリケーションということで、MVVM的につくっていきたいのですが、
・クライアント側にPOCO Entityを作成し、そこにJSONを展開して使えば良いのか
 ・その場合「変更追跡」などはどのように行えばよいのか
 などが、よくわかりません。

ちなみに昔の方法でDataTableに展開し、処理するという方法はうまくいきました。

※JSONをDataTableにforeachiで回しながらセットし、その後Acceptchang

クライアント側のEntityFreameworkを使うとなるとどのような方法がありますでしょうか?
サンプルなどございましたら、教えてください。

お願いいたします。

DatePickerのWatermarkプロパティの変更について

$
0
0

WPFでDatePickerを使用してUIを作成しております
動作させる環境によって値を設定する前のwatermarkが
"日付の選択"だったり"Select a date"安定しないため
コードでwatermarkとして表示される文字列を指定して
必ず決まった文字列を表示しようと思っています。

以下のようにいくつかの方法を試してみましたが、すべてうまく動きませんでした。

1.xamlで以下のように記述してみました

<DatePicker><DatePicker.Resources><Style TargetType="{x:Type DatePickerTextBox}"><Setter Property="Watermark" Value="test"/></Style></DatePicker.Resources></DatePicker>

コンパイル時に
error MC3080: Property Setter 'Watermark' は、アクセス可能な set アクセサーがないので設定できません。
というエラーが発生してしまいました。

2.DatePickerから派生したクラスを作成し以下のように記述してみました

    public class DatePickerEx : DatePicker
    {
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            var dptb = Template.FindName("PART_TextBox", this) as DatePickerTextBox;

            dptb.Watermark = "test";  // <-参照が足りないといわれるが何が足りないかわからない
        }
    }

コンパイル時に参照が足りないと言われてしまいました
Watermarkへの代入をコメントアウトした場合、コンパイルはとおり
dptbの値をウォッチで確認する限りではWatermarkは存在し値も変更可能でした
DatePicker自体は使用できていますが、いったい何の参照が足りないのでしょうか?

3.https://msdn.microsoft.com/ja-jp/library/vstudio/ff468215(v=vs.110).aspxを参考に
  派生したクラスで以下のようにも書いてみました

    public class DatePickerEx : DatePicker
    {
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            var dptb = Template.FindName("PART_TextBox", this) as DatePickerTextBox;

            var wm = dptb.Template.FindName("PART_Watermark", dptb) as ContentControl;    // <-取得してみようとしたが見つからない
        }
    }
見つからないようで、wmがNULLで返ってきてしまいます、何が間違っているのでしょうか?


開発環境は以下のようになっています

OS
Windows 8.1
Microsoft Windows [Version 6.3.9600]

開発環境
Microsoft Visual Studio Premium 2012
Version 11.0.61030.00 Update 4
Microsoft .NET Framework
Version 4.5.51641

プロジェクトの対象フレームワーク
.NET Framework 4.5



WPF MVVMにおけるModelのViewModel, Viewへの対応について

$
0
0

MVVMについて初歩的な質問があります。

使用している環境は下記のとおりです。

  • WPF 4.0
  • Visual Studio 2013 Professional
  • MVVMフレームワーク Livet使用検討中

ModelからViewModel、Viewへと状態の変化を通知するにはプロパティに対してPropertyChangedイベント発行の追加や、ObservableCollection型のコレクションを使用する必要がありますが、これらはModelの深い部分にも使用していくものなのでしょうか?

(特に、すでに既存のModelがある場合など)

それとも、Modelの既存のプロパティの変化をViewに通知可能な形にするためPropertyChangedイベントの発行を行うなどのModelとViewのつなぎを行うのがViewModelの役割となるのでしょうか?

あるいは、ModelがViewModelの参照を持たないようにするにはModel側にもPropertyChangedなどの記述が必要になるため、Model側の上層でViewModelを意識した部分などを用意するものなのでしょうか?

web上のサンプルはどれもModelの階層が浅く、ViewModel == Modelぐらいのわかりやすさとなっているため、ModelのどのあたりまでViewを意識した設計にするものなのか検討がつきづらいです。

実際WPFでMVVMを意識して作成される際ModelがどのレベルまでViewを意識したコードとなっているのか、今までの経験などから教えていただけると助かります。

回答よろしくお願いします。

コモンダイアログの多言語対応

$
0
0

WPFでのアプリケーション開発ですが、質問内容がWPFに特化していません。すみません。

アプリ上でファイルを選択する時、下記を使用したいと考えています。

Microsoft.Win32.OpenFileDialog

現状ではWindowsの言語でコモンダイアログが表示されますが、任意の言語で表示させる事は可能でしょうか。

UserControlのViewModelへのModelの参照の渡し方について

$
0
0

初歩的な質問で申し訳ありません。

下記の環境で開発しています。

  • WPF 4.0
  • Visual Studio 2013
  • MVVMフレームワーク Livetを使用検討中

あるWindow上に数多くの要素を持ったUserControlを配置しています。(このUserControlはWindowが表示されてからWindowが閉じるまで存在します)

そのUserControlをMVVMを意識してデータバインディングで操作したいと考えています。

簡単に調べた感じではUserControlで操作したいコントロールを依存プロパティとしてWindowのViewModelから操作する、というサンプルコードをよく見かけます。

しかし、UserControl上で操作したい項目が多く、Windowに紐付いているViewModelのコードが肥大化することから、できればUserControl専用のViewModelを作成して操作をまとめようと考えています。


上図のように、UserControlのViewModelがModelの参照を持つにはどのようにModelの参照を渡せばよいのでしょうか?

WindowのViewはModelへの参照を持たないので、どうやってUserControlのDataContextにViewModelを設定してやればいいのかわかりません。

また、どこでUserControlのViewModelを生成するのが都合が良いのでしょうか?

簡単なサンプルコードなどを紹介していただけると助かります。

・・・これは関係のない質問になるのかもしれませんが、ModelがViewModelの参照を持つというのはMVVMの概念に則っているものなのでしょうか?

( V→VM←→M みたいな図をよく見るので・・・)

回答よろしくお願いします。

DataGridのContextMenuを利用して、CommandParameterで要素を参照する

$
0
0

こんにちは。
データグリッドを右クリックすると、メニューが開いてSampleItemの項を選択するとItemSelectメソッドが実行されます。
引数としてaをメソッドに渡しています。

CommandParameterをElementNameで渡している場合は引数aがNullになります。
Proxyを通して渡しているものは、データグリッドのインスタンスが渡っています。
これは、なぜElementNameの場合にのみ、うまくデータを渡すことができないのでしょうか。仕組みや理由について知りたいです。

<Window.Resources><local:BindingProxy x:Key="Proxy" Data="{Binding ElementName=SampleDataGrid}" /></Window.Resources><DataGrid x:Name="SampleDataGrid"><ContextMenuService.ContextMenu><ContextMenu><MenuItem Header="SampleItem" Command="{Binding OnItemSelect}" CommandParameter="{Binding Source={StaticResource Proxy}, Path=Data}" /> // OK<MenuItem Header="SampleItem" Command="{Binding OnItemSelect}" CommandParameter="{Binding ElementName=SampleDataGrid}" /> // NG</ContextMenu></ContextMenuService.ContextMenu></DataGrid>

        private DelegateCommand<object> _OnItemSelect;
        public DelegateCommand<object> OnItemSelect
        {
            get
            {
                if (_OnItemSelect == null) _OnItemSelect = new DelegateCommand<object>(ItemSelect);
                return _OnItemSelect;
            }
        }

        private void ItemSelect(object a)
        {
            if (a == null) throw new ArgumentNullException();
        }
public class BindingProxy : Freezable
    {
        public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy));

        public object Data
        {
            get { return (object)GetValue(DataProperty); }
            set { SetValue(DataProperty, value); }
        }

        public BindingProxy() { }

        protected override Freezable CreateInstanceCore()
        {
            return new BindingProxy();
        }

    }

参考になる例として、以下がありました。
https://social.msdn.microsoft.com/Forums/ja-JP/f2202fdc-2fab-4406-9189-58cfec6539da/contextmenu-commandparameter?forum=wpfja

ただ、ContextMenu内のMenuItemから要素を追跡できないみたいなのは仕様みたいですね、というコメントはあるのですが、なぜそんな挙動をするのかよくわかりませんでした。
上の例だと、StaticResourceのProxyは参照できているにも関わらず、ElementNameは参照できないというあたりが、特にうまく意味を理解できないでいます。
以上、わかる方いましたら教えてください。
よろしくお願いします。


Kinect for windows WPF Controlsについて

$
0
0

KinectでWPFを動かしたいです。

Microsoft.Kinect.Wpf.ControlsのKinectRegionを使えばウィンドウ上に手のアイコンカーソルが出てきます。

手を押し込むように前に突き出すとクリックされますが、自分なしたいのはそうではなく。

ボタンタグにアイコンカーソルを合わせると一定時間するとクリックしたいのです。

CursorSpriteSheetDefinitionに、PressHoldFinalFrame・PressHoldStartFrameという関数があったりSDKのサンプル画像にもそれらしい画像があるので機能自体はあるはずなのですがどうしても実現できません。

どなたか実現させる方法知りませんか?

バージョン

Kinect for Window v2

C#2013 WPF MVVMでのcomboBoxの値の検証について

$
0
0

現在C#2013 WPFでMVVMでアプリを作成しています。

MVVM入門 その2「入力値の検証」  -->https://code.msdn.microsoft.com/windowsdesktop/MVVM-850a376f

Windowに編集可能なcomboBoxが複数あり、上記を参考にして、マスタにないデータが入力されたらエラーが表示されるようにしています。

comboBoxにはマスタからIDとProductをBindingしています。

マスタのないProductを入力するとIDはNULLになります。

プリパティの設定部は以下のように記述しています。

set
            {
                if (value == null)
                {
                    this.SetError("Product", "未登録です。");
                }
                else
                {
                    this.Produc2val = value;
                    this.ClearError("Product);
                    NotifyPropertyChanged("Product);
                }
            }

comboBoxの値は全て必ず入力する必要はないため、間違って入力した場合は、Deleteすることもあります。

この時、conboBoxの値をDeleteすると、マスタにない値が入力されたことになり、エラーが表示されてしまします。

どのようにすれば上記を回避出来ますでしょうか?

お分かりになられる方がいらっしゃいましたら、ご教授よろしくお願い致します。



ワーカースレッドでFixedDocumentを作成して、UIに表示する

$
0
0


こんにちは
件名のとおり、別のスレッドでドキュメントを作成してWindowにあるDocumentViewerに表示したいのですが、上手くいきません。

ドキュメントは、Gridで作成しています。
重たい処理だったので、別スレッドで作成してみたいと思い仮に実装してみたのですが何が問題なのか良くわかりません。
エラーメッセージは下記のとおりです。

追加情報:このオブジェクトは別のスレッドに所有されているため、呼び出しスレッドはこのオブジェクトにアクセスできません。

以下の場合は、2行目の場合はViewerが別スレッドだからダメで、3行目の場合はdocが別スレッドだからダメということになるのでしょうか。

      // ERROR
            //Viewer.Document = doc;
            //dispatcher.Invoke(new Action(() => { Viewer.Document = doc; }));

分かる方いましたら、ぜひ教えてください。
よろしくお願いします。

以下、コード。

private void Button_Click(object sender, RoutedEventArgs e)
        {
            var thread = new Thread(Work) { Name = "Document Create Worker", IsBackground = true };
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();

            Console.WriteLine("Total Memory = {0} KB", GC.GetTotalMemory(true) / 1024);
        }

        private void Work()
        {
            var dispatcher = Application.Current.Dispatcher;

            var doc = CreateDocument();

            // ERROR
            //Viewer.Document = doc;
            //dispatcher.Invoke(new Action(() => { Viewer.Document = doc; }));
        }

        private FixedDocument CreateDocument()
        {
            var document = new FixedDocument();
            var pageContent = new PageContent();
            var page = new FixedPage
            {
                Width = 800,
                Height = 600,
            };

            var printGrid = new Grid();
            printGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto) });
            printGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) });

            // 重たい処理
            var label = new Label { Content = "Test Content Data." };
            label.SetValue(Grid.ColumnProperty, 0);
            label.SetValue(Grid.RowProperty, 0);
            printGrid.Children.Add(label);

            page.Children.Add(printGrid);
            pageContent.Child = page;
            document.Pages.Add(pageContent);

            // UI要素をバックグラウンド処理で作成するとメモリリークが発生するため、明示的にシャットダウンを指示する
            Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.SystemIdle);
            Dispatcher.Run();

            return document;
        }


サンプルのプロジェクトファイル
http://1drv.ms/1DYsEIC




DataGridのセル結合

$
0
0

はじめて投稿させていただきます。

DataGridのセル結合について調べてまして、ほぼ無理なのは今も変わらないようですね。

それでもなんとかできないか挑戦しています。

仕様の要求から以下のようなテンプレートのDataGridを使っています。

標準の編集モードは利用せず、自前でTextBoxを張り付けています。

<DataGridTemplateColumn Header="a"><DataGridTemplateColumn.CellTemplate><DataTemplate><TextBox Text={Binding C1}"/></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn>

「a」列には同じ値が続く場合があるので、そこを結合させたいのです。

試してみるうちに、上記のTextBoxにアクセスできる事がわかり、

これを結合後のセルの大きさにサイズを変えて覆いかぶせれば

あたかも結合したように見えると考えました。

サイズを変えるまではできるのですが次の行のセルの裏に潜っているので

ZIndexで調整を試みているのですがダメです。

このTextBoxを最前面に持ってくる方法はないのでしょうか?

TextBox tb = dg.GetTextBox(0, 1); ←自前で作ったTextBoxを取得する拡張メソッド
Canvas.SetZIndex(tb, 1); ←ZIndexを設定。しかし機能せず。
tb.Height = 200; ←結合後の高さを設定。サイズはきちんと変わっている。(SNOOPで確認)


TextBoxにViewBoxを適用したときの外観

$
0
0

お世話になります。

TextBoxにViewBoxを適用した時に、テキストが短い場合、テキストボックスのサイズ自体が小さくなってしまい困っております。

やりたいことは、テキストボックスのサイズ自体は常にGridの枠いっぱいで、Windowのサイズが変わると、ViewBoxを適用した他のTextBlockなどの文字のサイズに合わせてテキストボックスの文字の大きさが変わるようにしたいです。

MinWeightを設定すれば画面表示時は対応できるのですが、画面を大きくするとテキストボックスのサイズが小さくなってしまいます。

ViewBoxを使わない方法でも構わないので、何かいい方法はないでしょうか?


また、ComboBoxでも同じようなことが起きてしまします。

ViewBoxは使わずにウィンドウのサイズに合わせてFontsizeをバインドした方が良いのでしょうか?

どなたかご教授お願い致します。

宜しくお願い致します。

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Button Margin="5">
            <Viewbox>
                <TextBlock Text="hogehoge" />
            </Viewbox>
        </Button>
        <Viewbox  Grid.Row="1">
            <TextBox Grid.Row="1" Text=""/>
        </Viewbox>
    </Grid>



指定した言語のDisplayNameを持つCultureInfoの取得方法

$
0
0

次の様な機能を実装したいと考えています。

  • 言語のリストを表示する。
  • ユーザが任意の言語を選択したら、言語のリストを選択された言語でのリストに表示し直す。
  • 例えば、日本語を選ばれている時は、リストに「英語」「日本語」と表示される。
  • 英語を選ばれた時は、リストに「English」「Japanese」と表示する。

そこで、下記のように試して見ましたが、1回目は期待するDisplayNameを取得できましたが、2回目は1回目と同じものしか取得出来ませんでした。

初回に下記を実行すると、aaa.DisplayNameには「English」がセットされる。

            Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en");
            Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en");
            CultureInfo aaa = CultureInfo.GetCultureInfo("en");

同アプリ動作中に、下記を実行すると、aaa.DisplayNameに「English」がセットされる。(期待するのは「英語」)

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("ja"); Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("ja"); CultureInfo aaa = CultureInfo.GetCultureInfo("en");

実装方法になにか問題がありますでしょうか。

Triggerを使用してContentプロパティを変更した場合の挙動について

$
0
0

ToggleボタンのCheck状態に応じて、ボタン上に表示する図形を変更したいと考えています。

実現方法として、Triggerを使用してContentプロパティを入れ替えるという方法を試しました。

また、表示している図形の色は、有効状態などの状況に応じて通常のボタン同様に自動で変化してほしかったため、図形のFillプロパティを親ToggleボタンのForegroundとバインドしました。

その状態で動作を試したところ、チェック状態に応じて図形は変わるのですが、チェック状態時の図形の色がうまく取得できずに透明となてしまいます。

Triggerによって丸ごとContentプロパティを差し替えているため、差し替え後の図形オブジェクトが親Toggleボタンを探すことができないのかなと思うのですが、どのような解決方法がありますでしょうか?

下記にXamlを記します。

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"><Grid><StackPanel><CheckBox x:Name="chkEnable" Content="ボタン有効化" HorizontalAlignment="Center"/><ToggleButton IsEnabled="{Binding ElementName=chkEnable, Path=IsChecked}" Height="40" Width="40"><ToggleButton.Style><Style TargetType="ToggleButton"><Setter Property="Content"><Setter.Value><Rectangle Width="20" Height="20" Fill="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ToggleButton}, Path=Foreground}" /></Setter.Value></Setter><Style.Triggers><Trigger Property="IsChecked" Value="True"><Setter Property="Content"><Setter.Value><Ellipse Width="20" Height="20" Fill="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ToggleButton}, Path=Foreground}" /></Setter.Value></Setter></Trigger></Style.Triggers></Style></ToggleButton.Style></ToggleButton></StackPanel></Grid></Window>

MVVMにおけるTextBoxの入力制限について

$
0
0

WPF アプリケーションを開発しております。

ViewにあるTextBoxへの入力を制限したいのですが、つまずいております。

TextBoxに特定の文字(サンプルコードでは'S')が入力された際、その文字を入力させないor削除することは可能でしょうか。

私達は、この入力に制限を加えることはModelの責務と考え、入力不可の文字が入絵よくされた際、Modelのプロパティのsetにて値を修正するといった方法を考えました。

しかし現状では「入力した'S'がTextBoxに表示されてしまう」といった問題点がございます。TextBoxに表示させない方法はございますでしょうか。

よろしくお願いいたします。

以下にサンプルコードの抜粋を記載いたします。

■ MainWindowViewModel ------------------------------------------------------------------------------------

<TextBox    Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"    Height="24" HorizontalAlignment="Left" Margin="135,30,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />

■ MainWindowViewModel : ModelBase  --------------------------------------------------------------------

//ViewModelBaseはINotifyPropertyChangedを実装しています。

public class MainWindowViewModel : ViewModelBase
   {
      private Person _person;

      /// <summary>
      /// 名前
      /// </summary>
      public string Name
      {
         get
         {
            return _person.Name;
         }
         set
         {
            if (_person.Name != value)
            {
               _person.Name = value;
               RaisePropertyChanged("");
               //RaisePropertyChanged("Name");
               //RaisePropertyChanged("UrNameIs");
            }
         }
      }

      public string UrNameIs
      {
         get
         {
            return "Ur Name Is " + _person.Name;
         }
      }

      /// <summary>
      /// コンストラクタ
      /// </summary>
      public MainWindowViewModel()
      {
         _person = new Person();
      }
   }

■ Person ------------------------------------------------------------------------------------------------------

//ModelBaseはINotifyPropertyChangedを実装しています。

public class Person : ModelBase
   {
      private string _name;
      /// <summary>
      /// Name
      /// </summary>
      public string Name
      {
         get
         {
            return _name;
         }
         set
         {
            if (_name != value)
            {
               if (value.Contains("S"))
               {
                  _name = value.Replace("S", "");
               }
               else
               {
                  _name = value;
               }
               RaisePropertyChanged("Name");
            }
         }
      }
        
   }

Viewing all 711 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>