2010-01-07 2 views
0

웹 브라우저 컨트롤에서 스크롤 막대를 사용하려고합니다. 그러나 사용자 지정 메시지 상자에 대한 메시지를 표시하는 데이 메서드를 사용할 것이므로 필요없는 경우에도 스크롤 막대를 표시하지 않으려합니다. 기본적으로 그렇게하는 것처럼 보입니다. 이를 피하기 위해 컨트롤의 스크롤 막대를 비활성화하고 대신 패널과 같은 다른 컨트롤에서 스크롤 막대를 사용하기로 결정했습니다. 이 방법은 브라우저 페이지의 내용이 너무 커서 적합하지 않은 경우에만 나타납니다.WebBrowser 컨트롤에 WCustom 스크롤 막대가 나타나지 않습니다.

비록 이것이 유효한 해결책 인 StackOverflow 에서조차 꽤 많은 게시물을 읽었지만 이것은 잘 해결되지 않았습니다. 내가 여기 솔루션을 사용하려고 할 때 하나의 예는 다음과 같습니다

Scrolling problem with a WebBrowser control contained in a Panel control

보인다으로 스크롤바는 웹 브라우저 사용할 경우,이 패널을 사용 스크롤바를 하나 못하게하지만. 이것은 디자인 모드에서 테스트 할 때와 같은 것으로 보입니다. 이를 극복하기 위해 패널 안의 웹 브라우저 뒤에 그림 상자를 추가했습니다. 디자인 모드 (그림 상자와 웹 브라우저의 크기를 조정하면 패널에서 해당 스크롤바를 사용할 수 있음)에서 실행되었지만 런타임 중에는 작동하지 않았습니다. 그림 상자를 웹 브라우저 컨트롤의 크기로 변경하려면 코드를 추가했습니다. 자체는 항상 스크롤 가능한 내용의 크기에 맞게 크기가 조정됩니다.

ScrollableRectangle 크기가 컨트롤의 크기보다 큰 경우에 따라 프로그래밍 방식으로 웹 브라우저의 스크롤 막대를 사용하거나 사용하지 않도록 설정했습니다. 이론적으로는 ScrollbarsEnabled 속성이 변경 될 때마다 컨트롤 내의 모든 텍스트를 지우는 것을 제외하고는 스크롤바가없는 상태로 다시 변경된다는 점을 제외하고는 이론적으로 괜찮을 것입니다. 키가 컨트롤에 누를 때마다

I 효과적으로이라고, 다음 코드로이 일을 해요 :

if (Output.Document.Body != null) 
{ 
    if (Output.Document.Body.ScrollRectangle.Size.Height > Output.Size.Height 
      || Output.Document.Body.ScrollRectangle.Size.Width > Output.Size.Width) 
     Output.ScrollBarsEnabled = true; 
    else 
     Output.ScrollBarsEnabled = false; 
} 
else 
    Output.ScrollBarsEnabled = false; 

이있는 것 나는 또한 HTML 편집기에 대한 해결책이 필요하다는 것을주의하는 것도 중요 응용 프로그램 내에서 사용되므로 이상적으로 모든 솔루션은 페이지로드 이벤트 등에 의존하지 않을 것입니다. 웹 브라우저가 디자인 모드를 on으로 설정했을 때 트리거되지 않는 것처럼 보이므로 HTML 편집기로 작동하는 데 필요합니다). 그러나이 특별한 상황에서 더 나은 솔루션이 없다면 기본 스크롤바를 사용하도록 설정할 수 있습니다.

편집 : HTML 내용의 스크롤 막대에 대해 이야기하는 것이 아닙니다. HTML의 유연한 서식 지정을 허용하기 위해 HTML이 사용 되었기 때문에 걱정할 필요가 없습니다. 브라우저 컨트롤 자체의 스크롤 막대에 대해서만 말하고 있습니다.

도움을 주시면 감사하겠습니다. 감사!

답변

2

나는 지금까지이 해결책을 찾았지만, 여기에 게시하는 것을 잊어 버렸다. 기본적으로 내가 한 것은 기본적으로 스크롤바를 사용하도록 설정했기 때문에 언제나 나타나지만 작동합니다.그런 다음 패널 컨트롤을 만들고 웹 브라우저 컨트롤의 오른쪽에 나타나는 비활성 스크롤 막대 맨 위에 크기를 조절했습니다.

다음으로 스크롤 막대 패널의 앵커를 변경하여 위쪽, 아래쪽 및 오른쪽이 항상 폼의 크기에 스냅되도록하고 그에 따라 브라우저 컨트롤의 크기도 고정됩니다. . 이 높이 또는 폭보다 큰 것으로 판명 경우

그럼 I 브라우저의로를 ScrollRectangle 크기를 확인하고 비교하는 코드를 추가, I는 상기 커버 패널이 표시되지했으나 그렇지 남아 그 자리에.

여기에 관련 코드 조각입니다 : 이것이 내가 충분히 잘 작동 하나를 발견하기 전에 미래에 다른 사람이, 몇 가지 다른 방법을했다하는 데 도움이

  //If still bigger, set scrollbars: 

      if ((Output.Document.Body.ScrollRectangle.Size.Height > Output.Size.Height) || 
       Output.Document.Body.ScrollRectangle.Size.Width > Output.Size.Width) 
      { 
       ScrollPanel.Visible = false; 
       ScrollPanel.Enabled = false; 
      } 

희망.

나는 Sheng의 대답을 (내가 충분히 평판을 얻었을 때) 결정하기 시작했다. 먼저 응답 할 유일한 사람이었고 둘째, 시도 할 때 어떤 종류의 호출을 사용하려고 할 때 그의 정보가 도움이되었다. 런타임 중에 스크롤 막대를 활성화하십시오. 솔루션을 간단하고 효과적이라고 생각했지만.

+0

유용한 해결 방법, 나를 위해 일했습니다. +1 당신과 Sheng. – fre0n

1

너무 늦었습니다. IDocHostUIHandler.GetHostInfo는 웹 브라우저를 만들 때 호출되며 WebBrowser의 구현은 해당 ScrollBarsEnabled 속성 값을 기반으로 DOCHOSTUIFLAG_SCROLL_NO 또는 DOCHOSTUIFLAG_FLAT_SCROLLBAR 플래그를 설정합니다.

웹 브라우저 컨트롤 창을 만들기 전에 ScrollBarsEnabled를 false로 설정하는 것이 좋습니다.

body, div 또는 textarea와 같은 특정 요소의 스크롤 막대를 표시하지 않으려면 해당 스타일을 overflow = 'hidden'으로 설정하거나 doc와 같은 요소에 대한 스크롤 속성을 사용할 수 있습니다 .Body.SetAttribute ("scroll", "no").

+0

문제가되는 페이지 요소가 아닙니다. 형식이 지정된 텍스트를 표시하는 데만 사용됩니다 (이미 richtextbox를 사용해 본 적이있어 이상적이지 않습니다). 내 문제는 웹 브라우저 컨트롤의 오른쪽 아래에있는 스크롤바가 콘텐츠가 현재 크기 내에 완벽하게 들어 맞아도/enabled 속성으로 표시된다는 것입니다. 기본적으로 콘텐츠/페이지가 너무 커서 웹 브라우저 컨트롤 안에 들어갈 수 없을 때 브라우저 스크롤바가 웹 브라우저 컨트롤에 나타나기를 원합니다. "너무 늦게"라고 말하면 브라우저의 스크롤바 속성을 프로그래밍 방식으로 변경한다는 의미입니까? – Geekman

+0

예, IDocHostUIHandler.GetHostInfo는 첫 번째 탐색 전에 호출됩니다. –

+0

나는 프로그래밍 방식으로이 속성을 설정하는 것이 작동하지 않는다는 결론을 이미 내 렸습니다 ... 그러나 원하는 결과를 얻기 위해 다른 방법을 생각할 수는 없습니까? – Geekman