ふらっとC#,C♯,C#(初心者用) Part92

■ このスレッドは過去ログ倉庫に格納されています
2012/04/26(木) 21:32:32.95ID:RzRn9VkL0
ふらっとVisual C#,C♯,C#(初心者用)

このスレッドは
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からない場合など、勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

なお、テンプレ2行目が読めない回答者は邪魔なので後述のC#相談室に移動して下さい。

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

関連スレ
ふらっとC#,C♯,C#(初心者用) Part91
http://toro.2ch.net/test/read.cgi/tech/1335089085/
C#, C♯, C#相談室 Part71
http://toro.2ch.net/test/read.cgi/tech/1332575004/


こんな感じでソフトウェア板に立てたらどうかな
2012/06/10(日) 14:36:26.02ID:JcRdqHi90
>>301
>>302

レスありがとうございました。参考にさせてもらいます
2012/06/10(日) 14:41:36.15ID:JcRdqHi90
重ねて質問すみません

txtBox1.Clear();
txtBox2.Clear();
txtBox3.Clear();

これを繰り返し構造でスマートに書きたいのですが、変数等を用いれば可能でしょうか
2012/06/10(日) 14:43:50.00ID:t7lhSWC+0
var array = new[]{ tb1, tb2, tb3 };

foreach(var tb in array){ tb.Clear(); }

とかかな
2012/06/10(日) 14:45:11.20ID:+ns6eJGu0
FormコンストラクタのInitializeComponent()の後ろで配列にでも入れておけ
foreachで繰り返せる
2012/06/10(日) 14:59:08.22ID:JcRdqHi90
なるほど!同じ型の配列に入れておけば良かったんですね
ありがとうございます
2012/06/10(日) 21:05:08.87ID:RMEDkwv20
製品版のVisualStudioってメンバー変数のプリフィックスに_とかつけられます?
2012/06/10(日) 21:45:47.86ID:+ns6eJGu0
むしろなぜ付けられないと思うの?
2012/06/10(日) 22:10:12.18ID:RMEDkwv20
Expressでできないからですね
Formのコントロール変数に自動で_をつけてくれたら便利だと思いまして
2012/06/10(日) 22:15:58.50ID:+ns6eJGu0
全然意味合いが違うじゃねえか
質問を略すな

Pro版でもできません
2012/06/10(日) 22:19:28.22ID:MHePrPj+0
自動でってところがミソか
2012/06/10(日) 23:40:57.57ID:RMEDkwv20
ありがとうございます。やっぱり無理でしたか・・・
315名無しさん@お腹いっぱい。
垢版 |
2012/06/14(木) 07:03:26.20ID:98NsRCek0
Formを継承したクラスがいくつかIDisposableなオブジェクトを持っていて、それらをDisposeしなければいけない場合
どこに書いたらいいんでしょうか。

Form1.Designer.csの方にFormのオーバーライドされたDisposeメソッドがありますが、
そこに追加しちゃってもいいのでしょうか。(デザイナの方に影響与えたりしません?)

それともDisposedイベントでやるべきなんでしょうか。
316名無しさん@お腹いっぱい。
垢版 |
2012/06/14(木) 07:36:22.23ID:A0uxVl2o0
1. そもそもインスタンススコープで扱うべきか考える
 実はメソッド単位で扱えるものなんじゃないの?という回帰。

2. コンポーネント化することもちと考える。
 Formと同じ寿命のDisposableなオブジェクトがあるってことは、
 Formにロジックを詰め込みすぎてないか?
 ロジックを然るべきレイヤに分けて、コンポーネント化しちゃえばいんじゃね?という発想。

3. Disposeしたいというのなら
 .Designer.csのオーバーライドされたDisposeメソッドに書いちゃって大丈夫。
2012/06/14(木) 08:37:45.34ID:SlYrQktU0
前から思ってたけどcomponentsフィールドっていつ使われるんだろ
あれに追加されたらFormが破棄されるとき一緒にDisposeしてくれるよね
2012/06/14(木) 09:19:19.33ID:98NsRCek0
>>316
ども
3でいかさせて頂きます

たとえばフォントオブジェクトをフォーム上のボタン等に個別に適用した場合
明示的にDisposeさせるよい方法がないので困っていました

フォーム閉じて参照が切れればいつかGCされるさ、とか
アプリケーションが終了した時点で解放されるからいいやん、とか
それだけでなんともならないシナリオもあるのに、と……
2012/06/14(木) 10:01:27.49ID:oUOmZZHy0
初心者なのでこちらで質問させてもらいます。
Aというクラスを継承してBというクラスを作成したのですが、Aの中の一部のフィールドやメソッドを継承したくない場合、Bの中でどうのような記述をすれば簡単に実現できるでしょうか?
目的は単にBのインテリセンスにそのメソッドなりを表示させたくないだけなのですが。
よろしくお願いします。
2012/06/14(木) 10:07:06.46ID:SlYrQktU0
>>319
Aの該当メンバーをprivate指定する
Bのほうから継承しないという指定はできない
C++ならできるけど煩雑すぎてC#には採用されなかった
2012/06/14(木) 10:10:46.97ID:WOJH/6WO0
private new ベースクラスのメソッド名(引数も合わせる ...){}

これで一応できるけどキャストしたらベースクラスのは呼び出せるわね
2012/06/14(木) 10:48:44.80ID:SlYrQktU0
newの使い道がよくわからないんだけど、virtual指定されてないメソッドをオーラーライドしたいときでいいの?
2012/06/14(木) 11:08:28.11ID:WOJH/6WO0
オーバーライドするとベースクラスにキャストした時もオーバーライドしたメソッドが呼び出せる
つまりベースクラスのメソッドを上書きできる

newの場合はベースクラスにキャストするとベースクラスのメソッドが呼び出される
上書きしたわけじゃなくて同じ名前のメソッドが定義されたので
前のが呼びだせなくなったという感じ
2012/06/14(木) 12:25:35.45ID:+pekMVIj0
abstract オーバーライドしろ
virtual  オーバーライドしてもいいよ
未指定   できなくは無いがnew付けろよ。
2012/06/14(木) 13:20:39.57ID:SlYrQktU0
>>323,324
ありがとう。つまりポリモーフィズムとはまったく関係ない機能なのか
どんな用途で使うんだろ・・・
2012/06/20(水) 23:24:01.56ID:W/4WFKKT0
>>325
一番は、後から基底クラスに派生クラスのメンバと被るメンバが追加されたときに
意図せずオーバーライドしてしまうのを防ぐため
その意味では別にnewは無くてoverrideだけでいいんだが、overrideの付け忘れなのか
わざとやってるのか区別するためなんだろう
2012/06/21(木) 12:27:26.65ID:K9S0VvT90
visual c#で、ボタンを押すとテキストボックスに入力した英文(長文)をもう一つのテキストボックスに文を並べ替えた状態で出力するアプリを作ろうとしています。
文を並べかえるというのは、単語の並べ替えではなく、複数の文の1文1文を1つと見て、それらの文を並べ替えるという意味です。

考えているアルゴリズムとしては、入力文を初めから一文字ずつ読み取っていき、ピリオドが出た瞬間に初めからその部分の文字列を 文字列1 に代入。
続いてその次の位置からまた一文字ずつ読み取っていき、ピリオドが出た瞬間に、その部分を 文字列2 に代入・・・と繰り返し、最終的にn個の文字列をランダムに並べ替えたものを出力する、というふうに考えています。

C#で作る場合このような流れで作るのがよろしいでしょうか?その場合どのような文字列操作関数を使用していけばいいのでしょうか。
また、他により効率的な方法があればご教示お願いします。
2012/06/21(木) 12:36:01.13ID:tG9UJEis0
ピリオドでスプリットすれば一発
2012/06/21(木) 12:45:20.29ID:K9S0VvT90
>>328
なるほど、splitメソッドというのを使えばいいのですね。

この場合、Mr.などの単語が1つだけの文が生成されないようにするには
具体的にどう条件を追加すればよろしいでしょうか?
(Mr. Tanaka is Japanese. を1つとしたい場合等)
2012/06/21(木) 12:50:03.71ID:tG9UJEis0
Mr.の場合はjoinすればいい
2012/06/21(木) 13:30:59.90ID:XTsjM3La0
var sentences = text.Split(".");
var list = new List<StringBuilder>();
list.Add(new StringBuilder());

foreach(var sentence in sentences)
{
 list.Last().Append(sentence + ".");
 if(IsOneWord(sentence) == false){ list.Add(new StringBuilder()); }
}

return Sort(list);

こんなかんじ?
2012/06/21(木) 13:39:41.01ID:K9S0VvT90
>>330-331
ありがとうございました
参考にして作ってみます!
2012/06/21(木) 13:46:05.56ID:mk4m3Qvr0
WPFでListboxを2つ配置して、ItemsSourceを同一のコレクションに設定した時の挙動についてなんですが
コードでこのようにしたとき

public partial class MainWindow : Window
{
ObservableCollection<Object> obj
= new ObservableCollection<Object>();

public MainWindow()
{ InitializeComponent();

for (int i = 0; i < 50; i++)
{ obj.Add(CreateRectangle());
obj.Add(i.ToString()+"s String");
}

listBox1.ItemsSource = obj;
listBox2.ItemsSource = obj;
}

Rectangle CreateRectangle()
{ Rectangle r = new Rectangle();
r.Width = 20;r.Height = 20;r.Stroke = Brushes.Black;
return r;
}
}

片方のListboxに表示されているRectangleはもう片方のListboxの表示からは取り除かれてしまいます
stringについては両方同時に表示されますし、片方のDisplaymenberPathをNameなりHeightなりに設定した場合も同時に表示されます
このWPFの図形の表示の仕組みについて解説お願いします
2012/06/21(木) 13:53:56.22ID:/1f0rY470
UIElementがデータソースになった場合、
それは直接ItemsControlの子孫要素になる
UIElementは一つの親にしか属せない
普通はRectangleはDataTemplateにして
ItemsSourceにバインドするのはその構成要素だけ持つクラスにする
2012/06/21(木) 19:56:05.31ID:C/I3uX5s0
XmlSerializerを使ってデータを一時的に保存したいと思っています.
今作っているクラスはUserとEventListとEventの三つになり,こんな感じに他にデータも含みます.
User
-string name
-EventList
--Event
---int x,yなど

保存したいのはUserクラスで,List<Event>を含んでいたので,
http://handcraft.blogsite.org/ComponentGeek/ShowArticle/60.aspx
を参考に,IXmlSerializableを実装してリストを保存するだけのクラスEventListを作りました.
そしてEventやEventList単体のシリアライズ化には成功しました.

ですがUserクラスのシリアライズが上手く行きません…

Userクラスはこうなっています
public class User {
public EventList event_list;
public string name;
public User() { }
}
336335
垢版 |
2012/06/21(木) 19:57:19.59ID:C/I3uX5s0

シリアライズのコードはこうなっています.
XmlSerializer serializer = new XmlSerializer(typeof(User));
using (FileStream fs = new FileStream(@"C:\test.xml", FileMode.Create)) {
serializer.Serialize(fs, user);}

実行すると
$exception {"There was an error reflecting type 'mtest.User'."} System.Exception {System.InvalidOperationException}
というエラーがXmlSerializer作成時に出ます.
event_listをコメントアウトすると上手く行くのですが,クラスの中に自作クラスを持つ場合は別の処理方法があるのでしょうか?
よろしければ解決方法などを教えて頂けると幸いです.
2012/06/21(木) 22:40:14.42ID:XTsjM3La0
>>336
別に普通にやればいいだけなはずだけどなあ
Listも変なことしなくてもそのままSerialize出来ると思うけど

publicなゲッターセッターと引数なしのコンストラクタを持っていること
コレクションの場合はAdd(T item)を持っていること といった感じだったと思う
2012/06/22(金) 00:18:49.52ID:D9lptrmf0
駄目なのはList<T>[]であってList<T>じゃないよ?
339335
垢版 |
2012/06/22(金) 22:10:59.58ID:bY8JRY9Z0
>>337 >>338
おうふ…勘違いしてました,Listのシリアライズは問題無いのですね.
いまやったところ単体で普通にできました.

またUserごとシリアライズしようとしたときのエラーですが,そちらも解決しました.
行数が多すぎて怒られた&そんなに関係ないだろうと思って消していたのですが実際はXmlAttributeをつけていて
Userクラスはこうなっています
public class User {
[XmlAttribute("user_event_list")]
public List<Event> event_list;
[XmlAttribute("name")]
public string name;
public User() { }
}

これでエラーが出たのでEventListクラスを作ったのですが,どうやら問題はXmlAttributeにあったらしく,
event_listの直前のものを消したら問題無く動きました.


皆さんどうもありがとうございます,とても助かりました.
340333
垢版 |
2012/06/22(金) 22:51:30.84ID:VRm8BDOa0
>>334
解説ありがとうございます
表示されない理由はばっちり腑に落ちました

> 普通はRectangleはDataTemplateにして
> ItemsSourceにバインドするのはその構成要素だけ持つクラスにする
よければ、ここについてもう少し教えてください

いま、Rectangle型のmyShape をメンバにもつクラス c1 を設定し、これのコレクションをListboxのソースとしたとき

<DataTemplate x:Key="myTemplate">
<StackPanel>
<Rectangle Height="{Binding Path=myShape.Height}" Width="{Binding Path=myShape.Width}" Stroke="{Binding Path=myShape.Stroke}"/>
</StackPanel>
</DataTemplate>
とし、Listboxのテンプレートとして適用すれば、全ての項で長方形は同時に表示することができました
ここでmyShapeの型をRectangleと限定せず、flameworkElementなどにして、
c1のインスタンスにはEllipceやその他のShapeを自由に入れられるようにし、それらを表示することは可能でしょうか
2012/06/23(土) 16:57:23.81ID:4W1+go0K0
int型配列a(要素数100)から等確率でランダムに10個の要素を選んで選んだ順に
配列b(要素数10)に代入するというプログラムを作りたいのですが、
自分が考えたのはひたすら100個のなかから1個ずつランダムで選んでいき、
前選んだ要素とかぶった場合はやり直し(棄却) という感じで作ったのですが、
選んでいくにつれて棄却する回数が多くなってしまい、時間がかかってしまいます。

この場合どのようなアルゴリズムで作るのが効率がいいのでしょうか?
2012/06/23(土) 16:59:23.81ID:VvicIvbe0
配列からランダムに一個選ぶ
選んだのを末尾のと交換する
個数を一個減らしてランダムに選ぶ・・・
2012/06/23(土) 16:59:57.81ID:F1v3/Dpc0
配列じゃなくて動的配列(List)を使えば、使用した要素を捨てられる
どうしても配列でやりたいなら被ったら上か下を選ぶって処理を入れる
2012/06/23(土) 17:37:18.45ID:8zHjbdI20
いわゆる重複しない乱数と同じ考え方だからググれば腐るほどでてくる
2012/06/24(日) 15:54:12.67ID:5cM7Ezza0
配列内の要素をシャッフルして先頭から10要素取り出せば?
2012/06/25(月) 01:06:49.19ID:2vZfjApk0
>>345
それだとM個からN個を取り出すときO(M)になるから非効率
2012/06/25(月) 01:49:47.37ID:QcDMISKM0
>>346
そうか。
要素数100程度みたいだからそんなんでいいかな、と勝手に思ったんだ。
そこまで考えてなかったよ。
2012/06/26(火) 09:46:52.99ID:/TbFwKc10
>>340
データソース側にUIElementは使うもんじゃないってば
DataTemplateのTargetTypeでデータソースの型によって適用するDataTemplate切り替えたりする
<ListBox ItemsSource="{Binding ...}">
  <ListBox.Resources>
    <DataTemplate DataType="{x:Type my:RectanglePattern}">
      <Rectangle Width="{Binding ...}" Height="{Binding ...}" Stroke="{Binding ...}"/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type my:EllipsePattern}">
      <Ellipse Width="{Binding ...}" Height="{Binding ...}" Stroke="{Binding ...}"/>
    </DataTemplate>
  </ListBox.Resources>
</ListBox>

あるいはデータソースをGeometry(を持ったクラス)にしちゃって
DataTemplateはImage/DrawingImage/GeometryDrawingでやるとか
2012/06/26(火) 16:08:21.13ID:yCJdNuh10
XAMLグロいなー
誰が考えたんだコレ
2012/06/26(火) 18:21:10.14ID:q2NBJkUf0
XML自体人が読み書きすることは重視してないからねー
構造的であることは人間にも利点があるが
人間にとってはせいぜい段組がしてあれば十分だ

こんなガチガチな仕様にしたのはコンピューターに合わせたからで
そのフォーマットの拡張系なんだから、よりコンピューターしか理解できないようになっていくのは当然だな
俺の好きなフレームワークにも

…and one more thing: Making humans edit XML is sadistic!

と書いてある
2012/06/26(火) 19:17:05.04ID:00qqaFC30
デリゲートって、クロージャみたいに親のメソッドで扱われる変数を保持できるけど、

public void Hoge(object obj)
{
 var act = new Action<obj>((o) => Fuga(o));
 this.actionList.Add(act);
}

これみたいに、Actionをフィールドのリストに入れてずっと保持する場合だと、
objの参照元はずっとGCされないまま(メモリリーク)になるの?

これなら実行タイミングを好きにずらせるから便利だなーと思ったけど、
objの参照をずっと掴んでるなら微妙だな。
2012/06/26(火) 19:21:22.63ID:q2NBJkUf0
そう
便利だけどよく分からずに手を出すのはお薦めできない
2012/06/26(火) 19:21:49.11ID:/TbFwKc10
そりゃListに保持するってことはいつか使うって宣言も同然なんだから
いつの間にか黙って消えてたら困るだろ
それをリークというのはおかしい
2012/06/26(火) 19:27:48.27ID:yCJdNuh10
ラムダの中でobj使ってないから参照もされないでしょう
Action<obj>っていうのもコンパイルエラーじゃないの
2012/06/27(水) 01:25:25.97ID:CEBjiC+M0
objを使いたい場合
var act = new Action(() => Fuga(obj));

引数をとりたい場合
var act = new Action<object>(o => Fuga(o));

引数をとりながらも無視してobjを使いたい場合
var act = new Action<object>(o => Fuga(obj));
2012/06/27(水) 14:23:59.88ID:ea0YHqGT0
パワポの左側のスライド一覧や、デスクトップ上でのアイコンの並び替えみたいに、
画像オブジェクトをD&Dによって移動・挿入可能なUIを作りたいと思っています。

ListViewに画像を表示させればかなり近いことが出来るのですが、
動画編集ソフトのタイムラインのように横方向に並べたいと思っています。

わりとよくあるUIだと思うのですが、既にコンポーネントとして利用できるようなものはありませんでしょうか?
357名無しさん@お腹いっぱい。
垢版 |
2012/06/27(水) 19:44:31.88ID:VN8+g37h0
ListViewのAutoArrange切って自前で配置すれば行けるような気もするけどどうだろ。
2012/06/27(水) 20:06:12.30ID:j1UJcMae0
WPFなら既存のコンポーネントを使うまでもなく一瞬でできる
2012/06/28(木) 03:36:32.96ID:Tqgyy0T20
どうやんのそれ
2012/06/28(木) 10:27:09.98ID:+mVAWSDX0
>>359
http://ideone.com/zKXvF
カレントディレクトリの画像の水平リスト表示
2012/06/29(金) 16:26:48.34ID:XSFFZlBa0
>>360
ほう
随分シンプルになるね
2012/06/29(金) 17:16:06.56ID:RwTE6+Al0
ttp://msdn.microsoft.com/ja-jp/library/ms734785(v=vs.90)

上のページで説明されている、

「If ステートメントの true 分岐部で、結果の TextBox コントロールから Invoke メソッドを呼び出します。その際、WorkflowCompletedEventArgs 型の新しいジェネリック EventHandler、workflowRuntime.WorkflowCompleted を渡します。
イベント ハンドラへのパラメータとして、sender および e ローカル変数を渡します。」

という部分では実際にどのようなコードを書けば良いのかわかりません。
どなたか教えて頂けないでしょうか。よろしくお願いします。
2012/06/29(金) 17:47:20.97ID:WHdThZGy0
WFってAsyncがあれば不要じゃね
2012/06/29(金) 17:50:26.45ID:RwTE6+Al0
>>363
会社で上からやれって言われまして。。
今までJavaだったもので、チュートリアルですら何言ってるのかわからない有様です。
2012/06/29(金) 17:53:18.26ID:WHdThZGy0
それでなんでいきなりWFなんだw
Javaが使えるならC#の文法は使いながら慣れればいいから、本屋でVisual C#の入門書を買ってこい
2012/06/29(金) 17:55:55.36ID:RwTE6+Al0
>>365
シェアポイントとWF使って業務系のアプリ作るんだそうです。
C#やってる人に聞いてみたのですが、>>362の内容分からないって言うんですよね。。
2012/06/29(金) 18:05:07.13ID:WHdThZGy0
どういうことか知らんが英語版に切り替えたらその部分のコードが表示されたぞ
2012/06/29(金) 18:12:02.03ID:RwTE6+Al0
>>367
ありがとうございます!!英語版に切り替えるというTipsを頂きました。
2012/06/30(土) 00:26:26.46ID:mUaSV7pq0
Control..::..ControlCollection Controls

..::..
ってどういう意味ですかね?
2012/06/30(土) 01:04:34.73ID:/TAxHS/T0
内部クラスだとMSDNではなぜかそうなってるがC#でそう書けるわけではない
内部クラスを区別したいときは Control+ControlCollection のように
ドットの代わりにプラスで区切る方が普通だと思う
371356
垢版 |
2012/06/30(土) 16:06:24.27ID:TtGpnjWE0
>>357 >>360
返事が遅れてすみません.
後者のListBoxを使ったやり方で結構いい感じに出来ました!
後はD&Dを実装してみることにします.
どうもありがとうございました!
2012/06/30(土) 16:51:28.38ID:bOu8zaDv0
昨日、MOBについて確認をしていて、以下の通りだと考えました
もし間違っている点があったら指摘していただけませんか?

@StreamWriter(Name, false, Encoding.xxx)、AEncoding.xxx.GetBytes()、BEncoding.xxx.GetString()
と共通の「Encoding.xxx」があったとして、UTF8などBOMが付く可能性があるEncodingの扱いは

A.「Encoding.xxx」が「UTF8Encoding」の場合、@BOMあり、ABOMなし、BBOMなし
B.「Encoding.xxx」が「UTF8Encoding(true)」の場合、@BOMあり、ABOMなし、BBOMなし
C.「Encoding.xxx」が「UTF8Encoding(false)」の場合、@BOMなし、ABOMなし、BBOMなし

となり、@はBOMの有無を選択できるが、A、Bは常にBOMが付与されない
てっきりEncoding.xxx.GetString()は選択できるものかと思っていたら、違ってました
2012/06/30(土) 17:13:44.19ID:bOu8zaDv0
× 昨日、MOBについて確認をしていて、以下の通りだと考えました
○ 昨日、BOMについて確認をしていて、以下の通りだと考えました
2012/06/30(土) 21:29:25.30ID:T5RC3JM20
確認したなら合ってるんじゃないの
2012/07/03(火) 02:33:11.58ID:QUnrlhAEP
BOM自体UTF16用のコンテナフォーマットで、プレーンテキストだとは思えない。
だからファイル保存に用いるWriterだけがそれを意識するで違和感は無いけどね。

>てっきりEncoding.xxx.GetString()は〜〜
GetStringで返却されるものは文字列オブジェクトだよ。
しかもその内部形式はUTF16LEを元にしているはず。

ちなみにUTF8だと基本BOM不要。
376356
垢版 |
2012/07/04(水) 17:05:03.96ID:lYNmBOff0
WPFでListBoxを作るときに,ItemsPanelTemplateにStackPanelを指定することで横方向に要素を並べることはできました.
ですが今やっている方法だとXAMLで指定した数しか使えないため,例えばボタンを押すとListBoxが増えていくといったことができません.
この場合どのようにやれば良いのでしょうか?

ListBoxと横方向のStackPanelを作ることはできたのですが,コード上でどのようにこの2つを関連づければいいのかがどうしてもわからなくて…
2012/07/04(水) 17:07:01.83ID:gyGKV+Vm0
動的に増えるものはコードで書くしかないんじゃないのかな?
378356
垢版 |
2012/07/04(水) 17:10:11.74ID:lYNmBOff0
>>377
はい,なので今はボタンを押したらコードが動いて横方向のListBoxを作る,といった事をやろうとしています.
ですがXAMLで横方向のListBoxを作る方法しか知らず,コードでどのように作ればいいのかがよく解りません…

XAMLだと
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Height="{Binding PhotoListBox.Height}" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
でいけるのですが…
2012/07/04(水) 17:24:57.33ID:gyGKV+Vm0
XAML
http://ideone.com/T6pIf

cs
http://ideone.com/fwfcg
380356
垢版 |
2012/07/04(水) 18:05:35.20ID:lYNmBOff0
>>379
ありがとうございます,追加の方法はわかりました.

ただ,今 >>360 さんの http://ideone.com/zKXvF のように,画像を横方向に並べたいと思っています.

ですがListBoxは初期状態では縦方向に追加されていってしまうので,
コード上で作ったListBoxも横方向に並べることはできたりしませんでしょうか?
2012/07/04(水) 18:09:14.74ID:gyGKV+Vm0
>>380
できるよ
WPFの場合カスタムクラス作り放題でそういう細かいところの情報がよくわからないので
いれられなかっただけなんだけどね

テンプレート作っておけばインスタンス作って所定の親の配下に入れる前に適応すれば
同じような物が作れるよ
382356
垢版 |
2012/07/04(水) 19:08:38.79ID:lYNmBOff0
>>381
なるほど…とりあえず不可能ではないのですね.
テンプレートについてよく解ってないので,その辺を中心に勉強してみます.
どうもありがとうございました.
2012/07/04(水) 19:10:32.28ID:gyGKV+Vm0
>>382
まずは>>380を参考にしてるのならテンプレートとかを分離して
リソース化することだね

最近触ってないのでうまくまとめて上げられないけど
2012/07/05(木) 10:34:39.47ID:tOoFlwMl0
カスタムコントロールを作った方が簡単だと思うよ
>>360のルート要素と基底クラスをUserControlに変更するだけ
385356
垢版 |
2012/07/05(木) 16:43:11.64ID:Ss1RhDP50
>>383
ありがとうございます!
リソース化する,という方法があることを知って思い通りになりました!

<Window.Resources>
  <ItemsPanelTemplate x:Key="HorizontalPanel">
    <StackPanel Orientation="Horizontal" Height="{Binding PhotoListBox.Height}" />
  </ItemsPanelTemplate>
</Window.Resources>

ListBox lb = new ListBox();
lb.ItemsPanel = (ItemsPanelTemplate)this.Resources["HorizontalPanel"];


>>384
ありがとうございます.
ですがすみません,カスタムコントロールとかは全く知らなかったので活かせませんでした…精進します.
2012/07/08(日) 00:29:36.30ID:ec05ZSJJ0
Rijndaelmanagedを使って暗号化を試みています
CipherMode列挙体がCBC他の時には問題なく暗号化が出来るのですが、CTSとOFBの時にはエラーになります
エラー「指定された cipher モードは、このアルゴリズムには有効ではありません。」

RijndaelManaged RM = new RijndaelManaged();
として、CTSはRM.Mode指定時に、OFBはRM.CreateEncryptor()生成時にエラーが発生します

モードにこだわりはないのでCBCを使えば良いのですが、調べてみてもRijndaelmanagedでCTS、OFB使えないという事例がなく、何かミスがあるのではないかと気になっています
もし思い当たることがあれば教えて下さい

RijndaelManaged RM = new RijndaelManaged();
//ブロックサイズ
RM.BlockSize = 128;
//キー最大長 ※事前に128、192、256から選択
RM.KeySize = Cipher_Rijndael_Size;
//CBCモード ※事前に各モードから選択
RM.Mode = Cipher_Rijndael_Mode;
//パディングモード
RM.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
//初期化ベクトルの設定と取得(ブロックサイズと同サイズ=128bit)
RM.GenerateIV();
byte[] bytesIV = RM.IV;
//処理済みパスワードをセット
RM.Key = Cipher_Rijndael_Key;

//暗号化オブジェクトの作成
ICryptoTransform encrypt = RM.CreateEncryptor();
2012/07/10(火) 12:07:54.64ID:vnyv6GV90
WPFで好きなタイミングで画面全体のスクリーンショットを取って保存しようとしています.
やたたいことは普通のC#で書くとこんな感じなんですが,WPFだとScreenやCopyFromScreenが使えません.

string take_screenshot()
{
Rectangle rect = Screen.PrimaryScreen.Bounds;
Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb);

using (Graphics g = Graphics.FromImage(bmp))
{
g.CopyFromScreen(rect.X, rect.Y, 0, 0, rect.Size, CopyPixelOperation.SourceCopy);
}

DateTime time = DateTime.Now;

long now = time.ToFileTimeUtc();
string filename = now.ToString() + ".png";
string filepath = screenshot_folder + "\\" + filename;
bmp.Save(filepath, ImageFormat.Png);

return filename;
}


一応SendKeysで取る方法はあったのですが,キーイベントを使わない方法を探しています.
http://www.ipentec.com/document/document.aspx?page=csharp-wpf-screen-capture-sendkey-winform
このページのCopyFromScreenメソッドを用いる方法も,上のコードと同じ理由で動きません.
どなたか他の方法をご存じの方はいらっしゃいませんでしょうか?
2012/07/10(火) 12:23:52.79ID:y0AM8kSz0
System.Windows.Forms.dllとSystem.Drawing.dllを参照すれば
WinFormのときのコードでいけるよ
2012/07/10(火) 17:05:29.33ID:WdTj8ymG0
WPFのウィンドウ内のスクリーンショットを撮るのであればRenderTargetBitmapでできるけど
画面全体はWPF全然関係ないな
そもそもそんなもんWPF使って作る必要あるのかと
390387
垢版 |
2012/07/11(水) 11:06:59.65ID:bXFj3Hio0
>>388
動きました、ありがとうございます!

>>389
元々WPFで作っていて、そこに全体をキャプチャする機能をつけようとして詰まっていました。
私の説明がはしょりすぎでしたね、すみませんでした。
2012/07/20(金) 14:57:37.20ID:+FWU6vnR0
ウィンドウ上のボタンを押すと,
ウィンドウが消える→処理実行→ウィンドウが元に戻る
といった動作をしたいと思っています.

そこでこのようなコードを書いてみたのですが,それぞれ独立に動かすと上手くいきますが,
上記のように一連の流れにすると上手くいきません.

public void window_visible()
{
Visibility = System.Windows.Visibility.Visible;
WindowState = System.Windows.WindowState.Normal;
}

public void window_close()
{
//ウィンドウを非可視にする
Visibility = System.Windows.Visibility.Collapsed;
}

public void play()
{
window_close();
      長い処理
window_visible();
}

おそらくは非表示にしても,こちらの処理中なのでウィンドウの再描画が行われないのが原因ではないかと思っているのですが,
再描画をするにはどのようにすれば良いのでしょうか?
window_close()の後にShow()を実行してみましたが最終的に非表示になってしまい,処理中に非表示にはなってくれませんでした…
2012/07/20(金) 15:20:17.18ID:ooVlvWEf0
これWinFormじゃないよね
WPF?
2012/07/20(金) 15:29:58.29ID:Ku4ZC7nA0
window_close();
Task task = Task.Factory.StartNew(長い処理);
task.ContinueWith(_task => this.Dispatcher.Invoke((Action)this.window_visible));
こんな感じ?
.NET 3.5までならBackgroundWorkerで
394391
垢版 |
2012/07/20(金) 16:36:09.50ID:+FWU6vnR0
>>392
はい,WPFでした.

>>393
動きました,ありがとうございます.
C#だと別スレッドで動かすのはこんなに簡単なんですね.
2012/07/20(金) 17:23:17.65ID:+FWU6vnR0
Listboxの要素をウィンドウ外にD&Dすると削除するようなコードを書こうとしています.
D&D自体のコードはこちらを参考にしており,同じウィンドウ内の別のListboxへは問題無くD&Dできています.
http://main.tinyjoker.net/Tech/CSharp/WPF/ListBox%A4%CE%A5%A2%A5%A4%A5%C6%A5%E0%A4%F2%C8%BE%C6%A9%CC%C0%A5%B4%A1%BC%A5%B9%A5%C8%A4%C4%A4%AD%A5%C9%A5%E9%A5%C3%A5%B0%A5%A2%A5%F3%A5%C9%A5%C9%A5%ED%A5%C3%A5%D7%A4%C7%CA%C2%A4%D9%C2%D8%A4%A8%A4%EB.html

古いですが似たような事をしようとしていた人がいましたが
http://oshiete.goo.ne.jp/qa/2668253.html
ウィンドウ外でドロップしてもe.ActionがDropになりません.
Continueは出続けているのですが,ドロップしたときのイベントが取れていないようです.

ドロップしようとしてもマウスカーソルが道路標識の通行止めマークになるので,それが原因だと思うのですが…
どなたか解決方法をご存じの方はお教え下さい.
2012/07/20(金) 19:25:37.01ID:tVdxnnS40
無理
2012/07/20(金) 21:35:04.33ID:s2qLDoTI0
マウスカーソルの移動をピクチャーボックス内に制限したいんですけど
Cursor.Clip = pictureBox1.Bounds;
としても、ピクチャーボックスのクライアント領域とは全然違う領域に
制限されてしまうんですけどどうしてですか?

ちなみに、Cursor.Clip = this.Bounds;
とすると、ちゃんとピクチャーボックスがのっているフォーム内に
きっちりと移動が制限されます。
Cursor.Clip = pictureBox1.ClientRectangle;
としてみても駄目でした。
2012/07/21(土) 00:33:29.87ID:vgwO4anV0
>>397
スクリーン座標
399395
垢版 |
2012/07/23(月) 10:48:31.41ID:ElUZG2xN0
>>396
無理ですか…
D&Dが開始されたけどドロップできる要素にドロップされずに終了した事を検知できればいけると思ったんですが,
やっぱり無理なんですね…
400395
垢版 |
2012/07/23(月) 11:17:14.75ID:ElUZG2xN0
自己解決しました.
>>399 の観点で探したら

DragDrop.DoDragDropの戻り値がドロップ失敗した時にDragDropEffects.Noneとなるので,
それを判定して処理すれば良かったようです.

2012/07/27(金) 21:33:17.33ID:Csfv2Zcb0
テキストファイルの中身をそのままstring型の変数に代入するにはどうやればいいですか

第二表示.txt
というテキストファイルのテキストをそのままstring型変数にいれたいんだけど。
2012/07/27(金) 21:34:26.76ID:Dpsmk2s/0
File.ReadAllText
2012/07/27(金) 21:40:36.93ID:Csfv2Zcb0
402
ありがとう
2012/07/28(土) 16:18:32.30ID:XfGkqQ3q0
404 Not Found
■ このスレッドは過去ログ倉庫に格納されています
大学生アイラと影の怪物と戦うリョウが、深夜3時3分の静止した世界で交錯する超常スリラーの概要

ニューススポーツなんでも実況